ES6引入了一种新的原始数据类型Symbol,用于表示独一无二的值,最常用的方式是用来定义对象的唯一属性名。
-
Symbol("description")可以接收一个字符串作为参数,用来为新建的Symbol提供描述。
let symbol = Symbol("desc");
-
Symbol()函数栈不能使用new命令,因为Symbol本身是JS的原始数据类型,因此它并不是对象。
let symbol = Symbol("desc");
console.log(symbol);//Symbol(desc)
console.log(typeof(symbol));//'symbol'
-
Symbol("description")每次生成的值都是不相等的
let symbol1 = Symbol("desc");
let symbol2 = Symbol("desc");
console.log(symbol1 == symbol2);//false
console.log(symbol1 === symbol2);//false
-
Symbol作为对象的属性名,可以保证不重名。
let symbol = Symbol("desc");
let obj = {};
obj[symbol] = "description";
console.log(obj);//{ [Symbol(desc)]: 'description' }
-
Symbol作为对象属性名时不能用运算符,要使用方括号[]。因为运算符后是字符串,所以获取的是字符串的属性,而不是Symbol值得属性。
let symbol = Symbol("desc");
let obj = {
[symbol]:"description"
};
console.log(obj);//{ [Symbol(desc)]: 'description' }
-
Symbol作为属性名时,属性是公有的而非私有的,因此在类的外部可以直接访问。
let symbol = Symbol("desc");
let obj = {
[symbol]:"description"
};
console.log(obj[symbol]);//description
- 若要获取对象的
Symbol属性,可使用Object.getOwnPropertySymbol()方法和Reflect.ownKeys()方法得到。
let symbol = Symbol("desc");
let obj = {
[symbol]:"description"
};
for(let item in obj){
console.log(item);//nothing
}
console.log(Object.keys(obj));//[]
console.log(Object.getOwnPropertySymbols(obj));//[ Symbol(desc) ]
console.log(Reflect.ownKeys(obj));//[ Symbol(desc) ]