Symbol是为了解决属性名冲突的问题而引入的,想要创建不会冲突的属性,可以new一个Symbol,每个创建的Symbol是独一无二的,不会冲突
var mySymbol = Symbol();
obj[mySymbol] = "ok!"; // called symbol-keyed property, guaranteed not to collide
console.log(obj[mySymbol]); // ok!
可以创建具有
description
的Symbol
,description
会在toString
时打印出来symbol-keyed property不能使用点号引用,需要使用方括号引用。
get 和 set symbol keyed property: element[Symbol]
检查有没有属性: if (Symbol in element)
删除属性: delete element[Symbol]Symbol 离开作用域,这个属性就没法引用了
Object.getOwnPropertyNames
,Object.keys(obj)
不会返回Symbol keyed property。Object.getOwnPropertySymbols(obj)
返回symbol-keyed property。
Symbol是单独的类型,Symbol不会自动转换成字符串,必须显示调用toString()
> typeof Symbol()
"symbol"
有三类Symbol
Symbol创建的新的Symbol
Symbol.for(string) 重复返回统一Symbol
标准里定义的Symbol,比如
Symbol.iterator
for (var item of myArray)
就是调用 myArray[Symbol.iterator]()
返回一个迭代器