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这类内部对象,所以他们也可以用 于WeakMap,WeakSet,WeakRef,和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