ES6知识点整理——symbol
symbol
ES5对象属性名都是字符串容易造成属性名的冲突。
var a = { name: 'lucy'};
a.name = 'lili';//这样就会重写属性
ES6引入了一种新的原始数据类型Symbol,这种数据类型提供独一无二的值。也就是说用symbol声明的变量得到的值永远不想等,保证他们是唯一的。
注意,Symbol函数前不能使用new命令,否则会报错。这是因为生成的Symbol是一个原始类型的值,不是对象
Symbol函数可以接受一个字符串作为参数,表示对Symbol实例的描述,主要是为了在控制台显示,或者转为字符串时,比较容易区分。
{
// 声明
let a1=Symbol();
let a2=Symbol();
console.log(a1===a2);//false
var s1 = Symbol("foo");
var s2 = Symbol("foo");
console.log(s1 === s2 );// false
}
Symbol.for(),Symbol.keyFor()
Symbol.for机制有点类似于单例模式,首先在全局中搜索有没有以该参数作为名称的Symbol值,如果有,就返回这个Symbol值,否则就新建并返回一个以该字符串为名称的Symbol值。和直接的Symbol就点不同了
{
let a3=Symbol.for('a3');
let a4=Symbol.for('a3');
console.log(a3===a4);//true
}
Symbol.keyFor方法返回一个已登记的Symbol类型值的key。实质就是检测该Symbol是否已创建
{
var s1 = Symbol.for("foo");
Symbol.keyFor(s1) // "foo"
var s2 = Symbol("foo");
Symbol.keyFor(s2) // undefined
}
Symbol()方法生成一个Symbol类型时,没有登记,所以每次调用Symbol(哪怕传入相同的字符串)会返回不同的Symbol,但是Symbol.for()在生成Symbol时候进行了登记,每次再次调用时,都会先寻找是否有传入相同参数的Symbol,故只有Symbol.for()产生的Symbol才能被Symbol.keyFor()找到。
symbol用于属性名
var s1 = Symbol();
var s2 = Symbol();
var s3 = Symbol();
var obj = {
[s1]: 'hi'
};
obj[s2] = 'ES6';
Object.defineProperty(obj, s3, {
value: 'ES2015'
});
console.log(obj); //Object {Symbol(): "hi", Symbol(): "ES6", Symbol(): "ES2015"}
console.log(obj.s1); //undefined -> 所以当用Symbol作为属性名时候,不能用.运算符访问属性
console.log(obj[s1]); //hi
console.log(obj['s1']); //undefined
注意:Symbol作为属性名,该属性不能被for...in...和let...of...拿到,也不会被 Object.keys(), Object.getOwnPropertyNames() 返回。可以用Object.getOwnProertySymbols()这个api返回一个数组,成员是当前对象的所有用作属性名的symbol值。
{
let a1=Symbol.for('abc');
let obj={
[a1]:'123',
'abc':345,
'c':456
};
console.log('obj',obj);//obj Object{abc:345,c:456,symbol(abc):'123'}
for(let [key,value] of Object.entries(obj)){
console.log('let of',key,value);//let of abc 345 let of c 456
}
Object.getOwnPropertySymbols(obj).forEach(function(item){
console.log(obj[item]);//123
})
Reflect.ownKeys(obj).forEach(function(item){
console.log('ownkeys',item,obj[item]);//ownkeys abc 345 ownkeys c 456 ownkeys symbol(abc) 124
})
}
上一篇: 【NodeJS】ES6的基础语法
下一篇: ES2015 classes(一)