Symbol 值通过Symbol函数生成:
const s = Symbol();
console.log(s); // Symbol()
console.log(typeof s); // symbol 表明变量s是 Symbol 数据类型
console.log(Symbol() === Symbol()); // false
Symbol数据类型的应用--向对象中添加两个属性值,保证属性名不重复:
const obj = {};
obj[Symbol()] = 1;
obj[Symbol()] = 2;
console.log(obj);
// 或:
const obj = {
[Symbol()]: 1,
[Symbol()]: 2, // ES6中可以保留末尾项的逗号
};
希望重新使用同一个 Symbol 值可以使用Symbol.for:
console.log(Symbol('a') === Symbol('a')); // false
const s1 = Symbol.for('foo');
const s2 = Symbol.for('foo');
console.log(s1 === s2); // true
---------------------------------------------------------------------------------------------------------------------------------
使用Symbol.toStringTag修改toString()的默认返回值:
const obj = {};
console.log(obj.toString()); // [object Object]
const obj = {
[Symbol.toStringTag] : 'xObject'
};
console.log(obj.toString()); // [object xObject]
---------------------------------------------------------------------------------------------------------------------------------
Symbol 作为属性名,遍历对象的时候,该属性不会出现在for...in、for...of循环中,也不会被Object.keys()、Object.getOwnPropertyNames()、JSON.stringify()返回。需使用Object.getOwnPropertySymbols()获取:
const obj = {
[Symbol()]: 'zs',
x: 'abc'
};
for (let i in obj) {
console.log(i); // x
}
console.log(Object.keys(obj)); // [ 'x' ]
console.log(JSON.stringify(obj)); // {"x":"abc"}
console.log(Object.getOwnPropertySymbols(obj)); // [ Symbol() ]
由于以 Symbol 值作为键名,不会被常规方法遍历得到。我们可以利用这个特性,为对象定义一些非私有的、但又希望只用于内部的方法。