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

时间:2018-07-23 23:36:54

标签: javascript string ecmascript-6 symbols

当我使用这样的代码时:

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

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

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

如果与我们可以写的相同:

document.querySelector('#someid')['attributeName'] = 'Hello, world!';

在这两种情况下,尽管我们不能确定此字符串是唯一的,但其他开发人员仍可以使用相同名称的属性,尽管该属性是否包装在for的{​​{1}}方法中。为什么需要使用Symbol.for()而不是纯字符串?

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

Symbol.for()

但是最简单的方法是临时更改模块内部的代码,将catchedVariable === exportedSymbolConst 添加到.for。然后,您可以编写条件:

Symbol

成功调试之后,您将只需删除catchedVariable === Symbol.for('string_key') 部分即可将代码改回。

2 个答案:

答案 0 :(得分:2)

如果您要避免与使用具有相同名称的全局符号的其他代码发生冲突,请不要使用Symbol.for()

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

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

Metaprogramming in ES6: Symbols and why they're awesome

中有更多有关哪些符号适合的信息。

答案 1 :(得分:0)

来自MDN约Symbol

  

从Symbol()返回的每个符号值都是唯一的。符号值   可以用作对象属性的标识符;这是数据   类型的唯一目的。

来自MDN约Symbol.for()

  

Symbol.for(key)方法在   具有给定键的运行时范围符号注册表,如果返回,则将其返回   找到了。否则,将在全局符号中创建一个新符号   使用此注册表项登录

因此,如果您使用Symbol.for()而不是Symbol(),则不是在使用提供唯一引用的Symbol的主要目的,因为调用时它可能会返回使用的引用。

然后在这种情况下,使用Symbol.for()作为引用(不好的做法)或使用字符串作为引用是相同的,因为两者都无法返回唯一的引用。结论是,我想说使用Symbol.for()代替字符串没有任何好处。