Symbol 数据类型的应用

Application of the Symbol datatype

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

有人知道吗?

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

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

将库方法子类化时会发生类似的事情。导入一个新版本的库,它可能突然有新的方法与你的冲突。

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

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

类 也可以使用它们来表示符合某些接口(因为 javascript 没有多重继承或接口),就像 Symbol.iterator 一样没有名称冲突的风险或必须妥协在它自己的方法名称上。

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

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