es6-9 Symbol

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
    })
}
原文地址:https://www.cnblogs.com/helzeo/p/11814310.html