大家都知道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属性