推荐答案
Symbol.for
和 Symbol
的主要区别在于它们创建 Symbol 的方式和作用域。
Symbol
每次调用都会创建一个全新的、唯一的 Symbol,即使传入的描述符相同。Symbol.for
会先在全局 Symbol 注册表中查找是否有相同描述符的 Symbol,如果有则返回该 Symbol,否则创建一个新的 Symbol 并注册到全局 Symbol 注册表中。
本题详细解读
Symbol
Symbol
是 ES6 引入的一种新的原始数据类型,表示独一无二的值。每次调用 Symbol()
都会生成一个全新的 Symbol,即使传入的描述符相同,生成的 Symbol 也是不同的。
const symbol1 = Symbol('foo'); const symbol2 = Symbol('foo'); console.log(symbol1 === symbol2); // false
在上面的例子中,symbol1
和 symbol2
虽然描述符相同,但它们是两个不同的 Symbol。
Symbol.for
Symbol.for
与 Symbol
不同,它会在全局 Symbol 注册表中查找是否有相同描述符的 Symbol。如果找到,则返回该 Symbol;如果没有找到,则创建一个新的 Symbol 并注册到全局 Symbol 注册表中。
const symbol1 = Symbol.for('foo'); const symbol2 = Symbol.for('foo'); console.log(symbol1 === symbol2); // true
在这个例子中,symbol1
和 symbol2
是同一个 Symbol,因为它们是通过 Symbol.for
创建的,并且描述符相同。
全局 Symbol 注册表
Symbol.for
使用的全局 Symbol 注册表是一个全局的键值对存储,键是描述符,值是对应的 Symbol。这意味着在不同的代码模块中,使用相同的描述符调用 Symbol.for
会返回同一个 Symbol。
// module1.js const symbol1 = Symbol.for('foo'); // module2.js const symbol2 = Symbol.for('foo'); console.log(symbol1 === symbol2); // true
在这个例子中,symbol1
和 symbol2
是同一个 Symbol,因为它们都是在全局 Symbol 注册表中查找或创建的。
总结
Symbol
每次调用都会创建一个全新的 Symbol,即使描述符相同。Symbol.for
会在全局 Symbol 注册表中查找或创建 Symbol,确保相同描述符的 Symbol 是唯一的。
通过理解 Symbol
和 Symbol.for
的区别,可以更好地掌握 Symbol 的使用场景和作用域。