Skip to content

JavaScript 中的 well-known Symbols

简述

Symbol 构造器上定义的所有静态属性都是 Symbol 对象, 他们被称为 well-konwn Symbols。定义它们的目的是作为特定的内置 JavaScript 操作的“协议”,使得开发者可 以自定义语言的行为。例如构造器函数可以通过定义名字为Symbol.hasInstance对象的方法来定制instanceof操作符的行为。

在没有使用well-known Symbols以前,JavaScript 曾经使用普通的属性来实现特定的内置操作。例如,JSON.stringify函数会尝试调用每个对象的toJSON()方法, String函 数会调用对象的toString()valueOf()方法。但是当更多的操作被添加到语言时,给每个操作指名一个魔法属性(magic property)会破坏向后兼容性,使得语言的行为很难被 理解。well-known Symbols实现了自定义行为的代码对普通代码的不可见,因为普通代码的属性名称通常只会使用可读的字符串。

在 MDN 和其他的文档中,well-known Symbols使用@@前缀风格,例如Symbols.hasInstance被写做@@hasInstance。这是因为 symbol 没有实际的字面格式,直接使 用Symbol.hasInstance无法区分使用字符串Symbol.hasInstance作为名称的方法和Symbol.hasInstance对象作为名称的方法。这类似Function.name"Function"的区别。

well-known Symbols没有垃圾回收的概念,因为它们在程序的生命周期中是固定存在且独一无二的,类似像Array.prototype这类内部对象,所以他们也可以用 于WeakMapWeakSetWeakRef,和FinalizationRegistry对象。

注:以上内容主要参考 [MDN]

Symbol.asyncIterator

for await...of

Symbol.hasInstance

instanceof

Symbol.iterator

for...of

Symbol.match

Symbol.matchAll

Symbol.replace

Symbol.search

Symbol.species

Symbol.toPrimitive

Symbol.toStringTag

Symbol.unscopables

Released under the MIT License.