首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Symbol.for(string)在ECMAScript 6中

Symbol.for(string)在ECMAScript 6中
EN

Stack Overflow用户
提问于 2015-06-22 16:13:12
回答 3查看 829关注 0票数 13

这花了我一段时间,但我终于明白了ECMAScript 6中符号的用途是什么:在将属性附加到共享对象时避免名称冲突(例如,如果您遇到相同的问题,我建议使用这篇文章)。

但后来我偶然发现了Symbol.for()。显然,ECMAScript 6将维护一个全局符号注册表,您可以通过提供符号描述来查询这个功能。再来啊?如果我使用符号来避免名称冲突,为什么我想让除我自己的代码之外的代码使用它们?(*)以及如何避免全局注册表中的名称冲突?符号共享似乎完全颠覆了这一概念,而全球注册表则加倍地颠覆了这一概念。

(*)是的,我知道符号并不是真正的隐私,但这不是重点。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-06-22 16:21:57

如果您不希望您的符号在GlobalSymbolRegistry中可用,就不要使用Symbol.for

只有当您希望允许其他代码使用您的符号时才使用它。

在下面的示例中,我创建一个符号来将数据存储在DOM元素中。我可能希望所有其他代码(例如内部原始未编译处理程序)都能读取这些数据。所以我把这个符号放在全球范围内。

代码语言:javascript
复制
var sym = Symbol.for('storeDataInDOM');
document.querySelector('button')[sym] = 'Hello, world!';
代码语言:javascript
复制
<button onclick="alert(this[Symbol.for('storeDataInDOM')])">Click me</button>

这就像创建全局变量:一般情况下应该避免,但有其优点。而是用符号而不是字符串。

票数 12
EN

Stack Overflow用户

发布于 2015-06-22 16:37:08

如果我使用符号来避免名称冲突,我为什么要使用自己的代码以外的代码呢?

这不是唯一的符号用例。另外两个最重要的问题是:

  • 它们不会与字符串键的属性发生冲突。
  • 它们并不是由通常的机制来列举的。

符号共享似乎完全颠覆了这一概念,而全球注册表则加倍地颠覆了这一概念。

不一定。从那篇文章中可以看到:“当多个网页或同一网页中的多个模块需要共享一个符号时,注册表是有用的。”最好的例子是内在的符号--它们可以保证跨领域的interoperability,这就是为什么全局符号注册表比全局范围更全局的原因。

例如,您可能有一个加载在网页、iframe和web工作者中的库。如果在这些环境(领域)之间共享数据,库的所有三个实例都希望使用相同的符号。

不同的库之间也存在着真正的互操作性,它们甚至可能不了解彼此。好的例子是换能器代数结构承诺。如果ES6已经在使用,那么所有这些都将在全局符号注册表中商定通用名称,而不是依赖像这些then方法这样的字符串。

另一个很好的例子将是由引擎定义的自定义钩子,例如可以用来定义console.log使用的自定义字符串化行为的Symbol.inspect = Symbol.for("inspect")。诚然,该符号不一定需要通过全局符号注册中心提供,它也可以放在特定的库对象(例如console.inspect = Symbole("console.inspect"))上。

如何避免全局注册表中的名称冲突?

就像您以前对属性或全局模块对象所做的那样:使用非常长、非常描述性的名称--或者真诚地使用。还有一些命名约定

票数 6
EN

Stack Overflow用户

发布于 2018-10-28 01:11:40

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

代码语言:javascript
复制
catchedVariable === exportedSymbolConst

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

代码语言:javascript
复制
catchedVariable === Symbol.for('string_key')

调试成功后,您将更改代码,只需删除.for部件即可。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30984858

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档