ES5对象属性名都是字符串容易造成属性名的冲突。这样就会覆盖掉原有属性。
var user={name:'abc'};
user.name='Hello';
JavaScript基本数据类型有6种:Undefined、Null、Boolean、String、Number、Object。
ES6新增了一种数据类型:Symbol,表示独一无二的值,Symbol最大的用途是用来定义对象的私有属性名。
let getName = Symbol('name');
let obj = {
[getName](){
return 'liqing';
}
};
console.log(obj[getName]());
Symbol属性不能通过Object.keys()和for in 得到:
let name = Symbol('name');
let obj2 = {
age:22,
[name]:'leo'
};
console.log(Object.keys(obj2)); //只有["age"]对象
for(let key in obj2){
console.log(key); //age
}
但是可以通过Object.getOwnPropertySymbols得到:
console.log(Object.getOwnPropertySymbols(obj2)); //[Symbol(name)]
let key = Object.getOwnPropertySymbols(obj2)[0];
console.log(obj2[key]);
Symbol.for首先在全局中搜索有没有以该参数作为名称的Symbol值,如果有,就返回这个Symbol值,否则就新建并返回一个以该字符串为名称的Symbol值。
Symbol.keyFor方法返回一个已登记的Symbol类型值的key。实质就是检测该Symbol是否已创建。
let user = Symbol.for('name');
let user3 = Symbol.for('name');
console.log(user === user3); //true
console.log(Symbol.keyFor(user3)); //name
console.log(Symbol.keyFor(user)); //name