当我使用这样的代码时:
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')
部分即可将代码改回。
答案 0 :(得分:2)
如果您要避免与使用具有相同名称的全局符号的其他代码发生冲突,请不要使用Symbol.for()
。
那么为什么要使用注册符号而不是字符串?符号具有字符串没有的其他功能。
Object.keys()
和Object.values()
不会返回任何使用符号命名的属性,必须使用Object.getOwnPropertySymbols()
。 答案 1 :(得分:0)
来自MDN约Symbol
从Symbol()返回的每个符号值都是唯一的。符号值 可以用作对象属性的标识符;这是数据 类型的唯一目的。
来自MDN约Symbol.for()
Symbol.for(key)方法在 具有给定键的运行时范围符号注册表,如果返回,则将其返回 找到了。否则,将在全局符号中创建一个新符号 使用此注册表项登录。
因此,如果您使用Symbol.for()而不是Symbol(),则不是在使用提供唯一引用的Symbol的主要目的,因为调用时它可能会返回使用的引用。
然后在这种情况下,使用Symbol.for()作为引用(不好的做法)或使用字符串作为引用是相同的,因为两者都无法返回唯一的引用。结论是,我想说使用Symbol.for()代替字符串没有任何好处。