Symbol数据类型的应用

时间:2015-02-10 12:49:45

标签: javascript node.js ecmascript-6

我试图找出自己,但没有任何成功。我想知道是否有一个有效的不可变数据类型应用程序Symbol

有谁知道吗?

1 个答案:

答案 0 :(得分:4)

符号的优点是它们是唯一的,不能与另一个实例冲突(假设您没有使用全局符号注册表)。这对于模块化,对象代理和库对象的向前兼容扩展非常重要。

请考虑以下情形:您为浏览器编写代码。你可以修改原型,比如HTMLElement,为你的库添加一个新的属性。 现在,whatwg / w3c出现并为标准添加了一个同名的属性。突然,您的图书馆与网络标准发生冲突。

当您子类化库方法时会发生类似的事情。导入库的新版本,它突然可能有新的方法与您的碰撞。

符号不会发生这种情况,因为您首先实例化一个不能与其他人的符号冲突的新的自定义本地符号。然后,您可以将其用作不会与任何第三方代码冲突的密钥。

使用模块,您只需将模块的符号导出为常量,使其可供其他模块访问,但只能通过适当的基于模块的命名空间,再次避免冲突。

类也可以使用它们来表示对某些接口的遵从性(因为javascript没有多重继承或接口),例如Symbol.iterator没有冒着名称冲突的风险或不得不在自己的方法名称上妥协。

此外,它们还可以用作函数参数,以避免魔术字符串常量,当它们与同一参数中的常规字符串处理混合时会特别危险。更不用说未声明的符号(通常作为常量导入)可能会导致比传入未知字符串更简单的错误,并且只是通过方法内部的特殊外壳掉落。

它们也可能提供性能优势,因为与符号相比,基本上是O(1)指针比较而不是字符串比较。至少在编译器无法推断字符串常量相同的情况下。