ES6-Symbol
大家都知道ES5对象的属性名都是唯一的,不可重复的。
如: var a = {name: 'value'}; a.name = 'value2'; 这样的话a里面的name的属性值就会被覆盖,不会生成第二个叫name的属性,具备唯一性。
ES6引入了一种新的原始属性类型:Symbol,表示唯一的值(独一无二)。
复习ES5数据类型:Number、String、Boolean、Null、Undefined
注意点:Symbol属性不能new,直接用它。
如: let newDataStructure = Symbol('abc'); console.log(typeof newDataStructure); //symbol 检测数据类型返回symbol console.log(typeof newDataStructure); //Symbol(abc) 打印全部被Symbol包裹abc
symbol属性内不仅可以放number、string、boolean类型外,还可以放对象
注意:放入对象一定需要具备一个toString方法,如果对象内没有toString方法就沿着原型链找toString方法。
//没放toString的结果 let o = Symbol({ name: 'zzh' }); console.log(o);//Symbol([object Object]) //有toString方法的结果 let s = Symbol({ name: 'zzh', toString: function(){ return 'age 18' } }); console.log(s.name);//Symbol(age 18)
Symbol属性具备唯一性。
let o = Symbol('a'); let s = Symbol('a'); console.log(o == s);//false //Symbol与NaN很象谁都不等于
let obj = {
[o]: 's1',
[s]: 's2'
}
console.log(obj)//{Symbol(a): "s1", Symbol(a): "s2"}
// 两个名字一样,验证了Symbol的唯一性
取值方法:
let o = Symbol('a'); let s = Symbol('a'); let obj = { [o]: 's1', [s]: 's2' } console.log(obj[o])//s1 console.log(obj[s])//s2 // 取值方法object[name]
Symbol.iterator属性:
console.log(Symbol.iterator);//Symbol(Symbol.iterator) 等同于 Symbol('Symbol.iterato'); //Array Set Map arguments nodelist等都有Symbol.iterator属性