使用 Symbol.for('string') 代替普通字符串有什么好处

And*_*lev 6 javascript string symbols ecmascript-6

当我使用这样的代码时:

const sym = Symbol('toAvoidInterference');
document.querySelector('#someid')[sym] = 'Hello, world!';
Run Code Online (Sandbox Code Playgroud)

避免干扰其他属性名称是有意义的。但使用有什么区别和好处:

const sym = Symbol.for('attributeName');
document.querySelector('#someid')[sym] = 'Hello, world!';
Run Code Online (Sandbox Code Playgroud)

如果是一样的话我们可以这样写:

document.querySelector('#someid')['attributeName'] = 'Hello, world!';
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,另一个开发人员可能会使用同名的属性,尽管它被包装到or notfor的方法中Symbol,因为我们无法确定该字符串是唯一的。为什么需要使用 Symbol.for() 而不是使用纯字符串?

UPD。我突然发明了call这个最有用的功能Symbol.for()。如果代码中存在使用符号,有时在调试时很难使用条件断点。例如,您需要捕获变量是否等于符号类型的值并且该值绑定在不同的模块中。第一个困难的方法是使用该值作为常量并将其从该模块导出。在这种情况下,断点的条件将如下所示:

catchedVariable === exportedSymbolConst
Run Code Online (Sandbox Code Playgroud)

但最简单的方法是暂时更改模块内的代码添加.forSymbol. 然后你可以写出条件:

catchedVariable === Symbol.for('string_key')
Run Code Online (Sandbox Code Playgroud)

成功调试后,您将把代码改回只是删除.for部分。

Bar*_*mar 5

Symbol.for()如果您试图避免与使用同名全局符号的其他代码发生冲突,则不要使用。

那么为什么要使用注册符号而不是字符串呢?符号具有字符串所没有的其他功能。

  • Object.keys()并且Object.values()不会返回任何使用符号命名的属性,您必须使用Object.getOwnPropertySymbols().
  • 它们不会与字符串键冲突;如果您对 DOM 元素上的属性使用符号,则不必担心它们与未来版本的 DOM 中添加的属性发生冲突。
  • 它们不会自动强制转换为原始类型,因此它们非常适合捕获错误。

在 ES6 元编程中,有一些关于什么符号有好处的更多信息:符号以及它们为何如此出色