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) ]