javascript - Symbol数据类型的应用

标签 javascript node.js ecmascript-6

我试图弄清楚自己,但没有成功。我想知道不可变数据类型 Symbol 是否有有效的应用程序。

有人知道吗?

最佳答案

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

考虑以下场景:您为浏览器编写代码。您修改 HTMLElement 的原型(prototype),为您的库添加新属性。 现在,whatwg/w3c 出现了,并向标准添加了一个同名的属性。突然间,您的库与网络标准发生了冲突。

当您对库方法进行子类化时,也会发生类似的情况。导入新版本的库,它突然可能会出现与您的方法冲突的新方法。

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

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

类还可以使用它们来表示符合某些接口(interface)(因为 javascript 没有多重继承或接口(interface)),例如 Symbol.iterator这样做不会冒名称冲突的风险,也不必妥协自己的方法名称。

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

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

关于javascript - Symbol数据类型的应用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28432131/

相关文章:

javascript - 无法对已卸载的组件调用 setState(或forceUpdate)。 React-image-gallery 上的内存泄漏

javascript - 如何使用 call() 进行继承。错误 : Class constructor cannot be invoked without 'new'

javascript - 写一个计数器来计算点击次数

javascript - 水平滚动条在 Protractor 中不起作用 - Firefox 浏览器

node.js - 使用舰队与 Nodejs 应用程序部署

javascript - 如何停止 Javascript 中的循环函数

javascript - Webpack:如何在一个全局变量下隐藏导出函数/变量?

Javascript 如何隐藏 div onclick 的短语

javascript - 找不到匹配的 div 时,.length() 不会返回 0

javascript - 自定义 querySelectorAll 实现