Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript ECMAScript 6中(字符串)的符号_Javascript_Symbols_Ecmascript 6 - Fatal编程技术网

Javascript ECMAScript 6中(字符串)的符号

Javascript ECMAScript 6中(字符串)的符号,javascript,symbols,ecmascript-6,Javascript,Symbols,Ecmascript 6,这花了我一段时间,但我终于明白了ECMAScript 6中符号的用途:在将属性附加到共享对象时避免名称冲突,例如HTML元素(如果您遇到相同的问题,我建议您这样做) 但后来我偶然发现了。显然,ECMAScript 6将维护一个全局符号注册表,您可以通过提供符号描述使用此函数进行查询。再来?如果我使用符号来避免名称冲突,为什么我希望自己的代码以外的代码使用它们?(*)如何避免全局注册表中的名称冲突?共享符号似乎完全颠覆了这一概念,而全球注册中心更是如此 (*)是的,我知道符号不是真正私有的,但这不

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

但后来我偶然发现了。显然,ECMAScript 6将维护一个全局符号注册表,您可以通过提供符号描述使用此函数进行查询。再来?如果我使用符号来避免名称冲突,为什么我希望自己的代码以外的代码使用它们?(*)如何避免全局注册表中的名称冲突?共享符号似乎完全颠覆了这一概念,而全球注册中心更是如此


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

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

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

在下面的示例中,我创建了一个符号来将数据存储在DOM元素中。我可能需要其他代码(例如)读取该数据。因此,我使符号全球可用

var sym=Symbol.for('storeDataInDOM');
document.querySelector('button')[sym]=“你好,世界!”
单击我
如果我使用符号来避免名称冲突,为什么我希望自己的代码以外的代码使用它们

这不是符号的唯一用法。另外两个最重要的因素是:

  • 它们不会与字符串键控属性冲突
  • 它们不是由通常的机制来列举的
共享符号似乎完全颠覆了这一概念,而全球注册中心更是如此

不一定。正如您所读到的:“当多个网页或同一网页中的多个模块需要共享一个符号时,注册表非常有用。”最好的例子是内在符号-它们保证跨领域的互操作性,这就是为什么注册表比您的全局范围更具全局性

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

不同的库之间也确实需要互操作性,它们甚至可能互不了解。好的例子是,或。如果ES6已经在使用,所有这些都将在全局符号注册表中约定通用名称,而不是依赖字符串或
then
方法

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

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


就像您以前对属性或全局模块对象所做的那样:使用非常长、非常描述性的名称,或者出于善意。还有。

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

catchedVariable === exportedSymbolConst
但最简单的方法是临时更改模块内的代码,将
.for
添加到
符号。然后您可以编写条件:

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

调试成功后,您将重新更改代码,只需删除
部分。

问题是:我为什么要共享我的符号?@PeterCoester我添加了一个示例。但问题是:为什么不呢?ES6提供了一种方法,如果您感兴趣,可以使用它,或者忽略它。但是,符号共享是否会产生与创建符号所要解决的问题完全相同的问题?您的示例没有确切显示共享符号的用例。@PeterCoester是的,存在冲突风险。但是全局变量也有同样的问题,人们无论如何都会使用它们。在我的示例中:如何访问内部原始未编译处理程序中的符号?引入GlobalSymbolRegistry可以在不污染global object.Hm的情况下执行此操作。是的,我想我现在可以看到很多用例。。。符号可以像jQuery中的函数一样使用,您可以通过这种方式附加和操作UI控件,例如,谢谢!这很有帮助。我对你的答案投了赞成票。因为你的问题不清楚,所以做
Symbol('somedescription')不在全局注册表中注册内容。只有当您通过
symbol.for
明确要求全球注册的符号时,才可以使用。是的,谢谢您的澄清!在这里,作者回答了你的问题:虽然这不是一个很好的例子。简单地说代码可能需要跨库和/或iFrame访问属性并不能说明为什么符号注册表是答案。