Symbol数据类型

本文介绍了Symbol数据类型,它提供独一无二的值,用于解决对象属性名冲突问题。Symbol值不参与常规运算,作为对象属性名时需用方括号访问,并且在遍历和序列化时不会出现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概念

这种数据类型提供一个独一无二的值

作用

用来解决对象属性名冲突的问题

注意

  • symbol值不能与其它类型的值进行运算,会报错

  • Symbol 值作为对象属性名时,不能用点运算符,因为点运算符后面总是字符串,所以不会读取mySymbol作为标识名所指代的那个值

  • 在对象的内部,使用 Symbol 值定义属性时,Symbol 值必须放在方括号之中

  • Symbol 作为属性名,该属性不会出现在for...in、for...of循环中,也不会被Object.keys()、Object.getOwnPropertyNames()、JSON.stringify()返回

代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Symbol</title>
</head>
<body>
<script>
//声明
{
    let a1 = Symbol();
    let a2 = Symbol();
    console.log(a1 === a2);//false
    console.log(typeof a1);//symbol
}

//可以用字符串来做区分、
{
    let s1 = Symbol('foo');
    let s2 = Symbol('bar');
    console.log(s1);//Symbol(foo)
    console.log(s2);//Symbol(bar)
}

//希望重新使用同一个 Symbol 值
{
    let s1 = Symbol.for('foo');
    let s2 = Symbol.for('foo');
    console.log(s1 === s2);//true
}

//通过for in 和 let of 拿不到属性值
{
    let a = Symbol.for('abc');
    let o = {
        [a]: 'what',
        abc: 'are',
        def: 'you'
    }
    console.log(o);
    //{abc: "are", def: "you", Symbol(abc): "what"}

    for (let [key, value] of Object.entries(o)) {
        console.log(key, value);
        // abc are
        // def you
    }
}

//Object.getOwnPropertySymbols 拿到symbol做为key值的对象属性
//返回的是一个数组
{
    let a = Symbol.for('abc');
    let o = {
        [a]: 'what',
        abc: 'are',
        def: 'you'
    }
    console.log(Object.getOwnPropertySymbols(o));
    //[Symbol(abc)]
    console.log(Object.getOwnPropertySymbols(o).forEach(function (item) {
        console.log(o[item]);
    }));
}

//通过 Reflect.ownKeys() 遍历找到对象中所有key
//返回的是一个数组
{
    let a = Symbol.for('abc');
    let o = {
        [a]: 'what',
        abc: 'are',
        def: 'you'
    }
    console.log(Reflect.ownKeys(o));

    Reflect.ownKeys(o).forEach(function (item) {
        console.log(item, o[item]);
    });
    // abc are
    // def you
    // Symbol(abc) "what"
}
</script>
</body>
</html>

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值