【问题标题】:What advantage of using Symbol.for('string') instead the plain string使用 Symbol.for('string') 代替纯字符串有什么好处
【发布时间】:2018-12-31 11:30:55
【问题描述】:

当我使用这样的代码时:

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!';

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

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

catchedVariable === exportedSymbolConst

但最简单的方法是临时更改模块内的代码,将.for 添加到Symbol。然后就可以写条件了:

catchedVariable === Symbol.for('string_key')

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

【问题讨论】:

标签: javascript string ecmascript-6 symbols


【解决方案1】:

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

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

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

Metaprogramming in ES6: Symbols and why they're awesome 中提供了更多关于哪些符号适用的信息

【讨论】:

  • 它们也是不可枚举的,这是另一个很大的好处。我应该澄清这个说法。它们不能通过for...in 枚举,即使它们的属性描述符说它们是可枚举的。
  • 根据我链接到的页面,您必须使用Object.defineProperty() 使它们不可枚举。
猜你喜欢
  • 1970-01-01
  • 2011-09-29
  • 1970-01-01
  • 1970-01-01
  • 2018-12-24
  • 1970-01-01
  • 2021-02-20
  • 2011-01-11
  • 1970-01-01
相关资源
最近更新 更多