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) 就是调用 myArraySymbol.iterator返回一个迭代器
作者:爱编程的胡图图
链接:https://www.jianshu.com/p/8b32763c60c4
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。