【发布时间】: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!';
在这两种情况下,其他开发人员可能会使用同名的属性,尽管它被包装到 Symbol 的 for 方法中,因为我们不能确定这个字符串是唯一的。为什么需要使用 Symbol.for() 而不是纯字符串?
UPD。
我突然发明了Symbol.for()通话这个最有用的功能。如果代码中有使用符号,有时在调试时很难使用条件断点。例如,您需要捕获变量是否等于符号类型的值,并且该值绑定在不同的模块中。第一个困难的方法是将此值用作常量并将其从该模块中导出。在这种情况下,断点的条件将如下所示:
catchedVariable === exportedSymbolConst
但最简单的方法是临时更改模块内的代码,将.for 添加到Symbol。然后就可以写条件了:
catchedVariable === Symbol.for('string_key')
调试成功后,您将改回代码,只删除.for 部分。
【问题讨论】:
-
如果您需要独特的符号,请不要使用
Symbol.for()。
标签: javascript string ecmascript-6 symbols