Symbol 的疑问学习

188 阅读2分钟

通过询问ChatGPT的方式学习解决关于Symbol的疑点

1、Symbol值的存储方式?

ChatGPT: 在 JavaScript 引擎中,Symbol 值通常被存储在类似于字符串的原始数据类型中,但与字符串不同,Symbol 值是唯一的且不可变的。它们被设计成用作属性键,以避免属性命名冲突。尽管存储位置的具体细节可能因引擎而异,但以下是一种常见的实现方式:

  1. Symbol 注册表(Symbol Registry): JavaScript 引擎通常会维护一个称为 Symbol 注册表的数据结构,用于存储所有已创建的 Symbol 值。这个注册表充当了一个全局的、唯一的标识符存储区域,确保每个 Symbol 值都是唯一的。引擎通过查找注册表来获取现有的 Symbol 值,或者在需要时创建新的 Symbol 值。

  2. 唯一 ID 或标识符: Symbol 值可能会被表示为唯一的标识符或 ID。这个标识符可以看作是 Symbol 的内部地址或索引,它在引擎内部用于唯一地标识一个特定的 Symbol 值。

当您创建一个 Symbol 值时,引擎会在 Symbol 注册表中查找是否已经存在具有相同描述的 Symbol 值。如果存在,它会返回已存在的 Symbol 值;如果不存在,它会在注册表中创建一个新的 Symbol 值,并将其描述作为标识符。

请注意,这只是一种常见的实现方式,实际上不同的 JavaScript 引擎可能会有不同的内部实现细节。无论具体实现如何,重要的是理解 Symbol 值的核心概念:它们是唯一且不可变的,用作属性键,有助于避免属性冲突。

2、 在node中测试使用Symbol作为属性键打印查看结果:

image.png

其键值显示为: [Symbol(name)]

3、遍历json对象b的键值呢?

image.png

发现通过Object.keys方式并未返回键值。

ChatGPT: 因为 Object.keys() 只返回可枚举属性,而默认情况下通过直接在对象字面量中创建的 Symbol 属性是不可枚举的。

如想要遍历包括 Symbol 属性的所有键(包括可枚举和不可枚举的),可以使用 Reflect.ownKeys() 方法:

image.png