Symbol
2022年10月14日大约 2 分钟
描述
是一种基本数据类型
Symbol()函数会返回symbol类型的值,该类型具有静态属性和静态方法
静态属性会暴露几个内建的成员对象
静态方法会暴露全局的symbol注册,且类似于内建对象类
作为构造函数来说它并不完整,因为它不支持语法:
new Symbol()
每个从
Symbol()
返回的symbol值都是唯一的一个symbol值能作为对象属性的标识符,这是该数据类型仅有的目的
语法:
Symbol([description])
- 参数
description
:字符串类型,对symbol的描述,可用于调试但不是访问symbol本身
- 参数
Symbol.length
长度属性,值为 0
Symbol.asyncIterator
Symbol.hasInstance
Symbol.isConcatSpreadable
Symbol.iterator
Symbol.match
Symbol.matchAll
Symbol.prototype.description
Symbol.replace
Symbol.search
Symbol.species
Symbol.split
Symbol.toPrimitive
Symbol.toStringTag
Symbol.unscopables
Symbol.for()
- 描述:根据给定的键
key
,从运行时的 symbol 注册表中找到对应的 symbol - 语法:
Symbol.for(key)
- key:一个字符串,作为 symbol 注册表中与某 symbol 关联的键,同时也会作为该 symbol 的描述
- 返回值:返回由给定的 key 找到的 symbol,否则就是返回新创建的 symbol
- 注意
- 和
Symbol()
不同的是,用Symbol.for()
方法创建的的 symbol 会被放入一个全局 symbol 注册表中 Symbol.for() 并不是每次都会创建一个新的 symbol
,它会首先检查给定的 key 是否已经在注册表中了。假如是,则会直接返回上次存储的那个。否则,它会再新建一个
- 和
Symbol.keyFor()
描述:用来获取 symbol 注册表中与某个 symbol 关联的键
语法:
Symbol.keyFor(sym)
参数
- sym:存储在 symbol 注册表中的某个 symbol
返回值
- 如果全局注册表中查找到该symbol,则返回该symbol的key值,形式为string
- 如果symbol未在注册表中,返回undefined
// 创建一个 symbol 并放入 Symbol 注册表,key 为 "foo"
var globalSym = Symbol.for("foo");
Symbol.keyFor(globalSym); // "foo"
// 创建一个 symbol,但不放入 symbol 注册表中
var localSym = Symbol();
Symbol.keyFor(localSym); // undefined,所以是找不到 key 的