Symbol 声明变量的值都是唯一的, 独一无二的
{ // 声明 let a1 = Symbol() let a2 = Symbol() console.log(a1 == a2); // false console.log(a1 === a2); // false }
Symbol.for() 声明独一无二变量的时候会检测这个 key 值是否在全局注册过, 如果注册过就返回注册值, 没有生成一个独一无二的值
{ let a3 = Symbol.for('a3') let a4 = Symbol.for('a3') console.log(a3 === a4); // true }
使用场景, 当存在声明的变量还要声明且不覆盖的情况下
{ let a1 = Symbol.for('abc'); let obj = { [a1]: 'my abc', 'abc': '456', 'c': '789' } console.log(obj) // {abc: "456", c: "789", Symbol(abc): "my abc"} }
对象中要是有 Symbol 做配值的话, for of for in 都是拿不到值的
{ let a1 = Symbol.for('abc'); let obj = { [a1]: 'my abc', // 不会覆盖下边的 abc 'abc': '456', 'c': '789' } console.log(obj) // {abc: "456", c: "789", Symbol(abc): "my abc"} for (let [key, value] of Object.entries(obj)) { console.log(key, value); // abc-456 c-789 } }
Object.getOwnPropertySymbols() 取 Symbol 的值, 但是只能取出 Symbol 的值
{// Object.getOwnPropertySymbols 取 Symbol 的值 Object.getOwnPropertySymbols(obj).forEach((item) => { console.log(obj[item]) // my abc 取出来了 }) }
Reflect.ownKeys() 都拿出来
{ // 能不能都拿出来呢 Reflect.ownKeys(obj).forEach(item => { console.log('ownKeys', item, obj[item]) // abc-456 c-789 Symbol(abc)-my abc }) }