浅谈Symbol()和Symbol.for()创建的区别

本文探讨了如何Symbol()函数创建的唯一标识符在比较时可能不相等,而Symbol.for()方法确保生成的Symbol在注册表中保持唯一,解释了两者的实现原理及为何结果不同。

Symbol()创建的值不相等而Symbol.for()创建的值相等,为什么?

先上例子:
1、用Symbol() 创建

<script>
    // let s = Symbol();
    // console.log(s,typeof s);
    let s2 = Symbol('我是小米');
    let s3 = Symbol('我是小米');
    console.log(s2==s3);
</script>

控制台输出结果:
在这里插入图片描述
2、用Symbol.for() 创建

   <script>
    let s4 = Symbol.for("我是红豆");
    let s5 = Symbol.for("我是红豆");
    console.log(s4==s5);
</script>

控制台输出结果:
在这里插入图片描述
疑问:为什么会出现这种情况???

解答:
使用Symbol.for() 方法创建时,会将创建的Symbol存入一个全局的注册表中,在下次创建时,会首先从注册表中查找是否已有相同的值存在,如果没有,则创建;如果有,便不会创建重复的Symbol。

这也就是解答了 为什么使用Symbol.for() 创建的两个Symbol判断是否相等时,返回的时true。

JavaScript 中,`Symbol.for` 是一个用于创建或检索全局符号注册表中符号的方法。 ### 使用方法 `Symbol.for` 接受一个字符串作为参数,这个字符串是符号的键。如果该键对应的符号已经存在于全局符号注册表中,`Symbol.for` 会返回这个已存在的符号;如果存在,则会创建一个新的符号并将其存储在全局符号注册表中,然后返回这个新符号。 下面是使用 `Symbol.for` 的代码示例: ```javascript // 创建一个带有键 "张三" 的符号 let s3_1 = Symbol.for('张三'); // 尝试获取键为 "张三" 的符号 let s3_2 = Symbol.for('张三'); // 验证这两个符号是否相同 console.log(s3_1 === s3_2); // true const s4_2 = Symbol.for('b'); const s4_3 = Symbol.for('b'); const obj = { [s4_2]: 2, [s4_3]: 3 }; // 由于 s4_2 s4_3 是同一个符号,所以对象中该符号对应的属性会被覆盖 console.log(obj); // {Symbol(b): 3} let c = Symbol.for("Hello"); // 获取符号的键 console.log(Symbol.keyFor(c)); // "Hello" ``` 上述代码展示了 `Symbol.for` 的基本使用,包括创建符号、验证相同键的符号是否相等以及获取符号的键等操作。 ### 原理 `Symbol.for` 会在全局符号注册表中维护一个键 - 符号的映射。当调用 `Symbol.for(key)` 时,它会首先在这个注册表中查找是否存在以 `key` 为键的符号。如果存在,就直接返回该符号;如果存在,它会创建一个新的唯一符号,并将这个符号与 `key` 关联起来,存储在全局符号注册表中,然后返回这个新符号。 需要注意的是,`Symbol.for` 创建的符号是全局共享的,这与直接使用 `Symbol()` 创建的符号同。直接使用 `Symbol()` 创建的符号是唯一的,即使传入相同的描述,它们也相等,并且会存储在全局符号注册表中。例如: ```javascript let s2_1 = Symbol("张三"); let s2_2 = Symbol("张三"); console.log(s2_1 === s2_2); // false let s3_1 = Symbol.for('张三'); let s3_2 = Symbol.for('张三'); console.log(s3_1 === s3_2); // true ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值