这花了我一段时间,但我终于明白了ECMAScript 6中符号的用途是什么:在将属性附加到共享对象时避免名称冲突(例如,如果您遇到相同的问题,我建议使用这篇文章)。
但后来我偶然发现了Symbol.for()。显然,ECMAScript 6将维护一个全局符号注册表,您可以通过提供符号描述来查询这个功能。再来啊?如果我使用符号来避免名称冲突,为什么我想让除我自己的代码之外的代码使用它们?(*)以及如何避免全局注册表中的名称冲突?符号共享似乎完全颠覆了这一概念,而全球注册表则加倍地颠覆了这一概念。
(*)是的,我知道符号并不是真正的隐私,但这不是重点。
发布于 2015-06-22 16:21:57
如果您不希望您的符号在GlobalSymbolRegistry中可用,就不要使用Symbol.for。
只有当您希望允许其他代码使用您的符号时才使用它。
在下面的示例中,我创建一个符号来将数据存储在DOM元素中。我可能希望所有其他代码(例如内部原始未编译处理程序)都能读取这些数据。所以我把这个符号放在全球范围内。
var sym = Symbol.for('storeDataInDOM');
document.querySelector('button')[sym] = 'Hello, world!';<button onclick="alert(this[Symbol.for('storeDataInDOM')])">Click me</button>
这就像创建全局变量:一般情况下应该避免,但有其优点。而是用符号而不是字符串。
发布于 2015-06-22 16:37:08
如果我使用符号来避免名称冲突,我为什么要使用自己的代码以外的代码呢?
这不是唯一的符号用例。另外两个最重要的问题是:
符号共享似乎完全颠覆了这一概念,而全球注册表则加倍地颠覆了这一概念。
不一定。从那篇文章中可以看到:“当多个网页或同一网页中的多个模块需要共享一个符号时,注册表是有用的。”最好的例子是内在的符号--它们可以保证跨领域的interoperability,这就是为什么全局符号注册表比全局范围更全局的原因。
例如,您可能有一个加载在网页、iframe和web工作者中的库。如果在这些环境(领域)之间共享数据,库的所有三个实例都希望使用相同的符号。
不同的库之间也存在着真正的互操作性,它们甚至可能不了解彼此。好的例子是换能器、代数结构或承诺。如果ES6已经在使用,那么所有这些都将在全局符号注册表中商定通用名称,而不是依赖像这些或then方法这样的字符串。
另一个很好的例子将是由引擎定义的自定义钩子,例如可以用来定义console.log使用的自定义字符串化行为的Symbol.inspect = Symbol.for("inspect")。诚然,该符号不一定需要通过全局符号注册中心提供,它也可以放在特定的库对象(例如console.inspect = Symbole("console.inspect"))上。
如何避免全局注册表中的名称冲突?
就像您以前对属性或全局模块对象所做的那样:使用非常长、非常描述性的名称--或者真诚地使用。还有一些命名约定。
发布于 2018-10-28 01:11:40
我发明了Symbol.for()调用最有用的特性。如果在代码中使用符号,有时在调试时很难使用条件断点。例如,如果变量等于符号类型的值,并且该值绑定在不同的模块中,则需要捕获该值。第一个困难的方法是将此值用作常量并从该模块导出它。在这种情况下,断点的情况如下:
catchedVariable === exportedSymbolConst但最简单的方法是暂时更改模块中的代码,将.for添加到Symbol中。然后,您可以编写条件:
catchedVariable === Symbol.for('string_key')调试成功后,您将更改代码,只需删除.for部件即可。
https://stackoverflow.com/questions/30984858
复制相似问题