Symbol.for 和 Symbol 的区别是什么?

推荐答案

Symbol.forSymbol 的主要区别在于它们创建 Symbol 的方式和作用域。

  • Symbol 每次调用都会创建一个全新的、唯一的 Symbol,即使传入的描述符相同。
  • Symbol.for 会先在全局 Symbol 注册表中查找是否有相同描述符的 Symbol,如果有则返回该 Symbol,否则创建一个新的 Symbol 并注册到全局 Symbol 注册表中。

本题详细解读

Symbol

Symbol 是 ES6 引入的一种新的原始数据类型,表示独一无二的值。每次调用 Symbol() 都会生成一个全新的 Symbol,即使传入的描述符相同,生成的 Symbol 也是不同的。

在上面的例子中,symbol1symbol2 虽然描述符相同,但它们是两个不同的 Symbol。

Symbol.for

Symbol.forSymbol 不同,它会在全局 Symbol 注册表中查找是否有相同描述符的 Symbol。如果找到,则返回该 Symbol;如果没有找到,则创建一个新的 Symbol 并注册到全局 Symbol 注册表中。

在这个例子中,symbol1symbol2 是同一个 Symbol,因为它们是通过 Symbol.for 创建的,并且描述符相同。

全局 Symbol 注册表

Symbol.for 使用的全局 Symbol 注册表是一个全局的键值对存储,键是描述符,值是对应的 Symbol。这意味着在不同的代码模块中,使用相同的描述符调用 Symbol.for 会返回同一个 Symbol。

在这个例子中,symbol1symbol2 是同一个 Symbol,因为它们都是在全局 Symbol 注册表中查找或创建的。

总结

  • Symbol 每次调用都会创建一个全新的 Symbol,即使描述符相同。
  • Symbol.for 会在全局 Symbol 注册表中查找或创建 Symbol,确保相同描述符的 Symbol 是唯一的。

通过理解 SymbolSymbol.for 的区别,可以更好地掌握 Symbol 的使用场景和作用域。

纠错
反馈