Symbol
全局注册Symbol实现Symbol的共享
- 使用Symbol()函数的上述语法不会创建整个代码库中可用的全局Symbol。 要创建跨文件甚至跨域的Symbol(每个域都有自己的全局作用域),请使用Symbol.for()和Symbol.keyFor()方法设置和检索全局符号注册表中的符号。
- 在对象上查找Symbol属性
Object.getOwnPropertySymbols()方法返回一个符号数组,并允许您在给定对象上查找符号属性。 请注意,每个对象都没有自己的符号属性进行初始化,因此除非您已经在对象上设置符号属性,否则此数组将为空。
属性
Symbol.length
长度属性值为0
Symbol.prototype
表示Symbol构造函数的原型
内置符号
除了自己的符号之外,JavaScript还有一些内置的符号,代表了内部语言行为,这些符号在ECMAScript 5以及之前没有向开发者公开。 这些符号可以使用以下属性进行访问:
Iteration symbols
Symbol.iterator
返回对象的默认迭代器,通常使用for … of
Symbol.asyncIterator
返回对象的AsyncIterator,通常使用 for await of
正则表达式符号
Symbol.match
与字符串匹配的方法,也用于确定对象是否可用作正则表达式。 由String.prototype.match()使用。
Symbol.replace
一种替换字符串的匹配子字符串的方法。通常使用String.prototype.replace()。
Symbol.search
返回与正则表达式匹配的字符串中的索引的方法。通常使用String.prototype.search()。
Symbol.split
在匹配正则表达式的索引处拆分字符串的方法。 通常使用String.prototype.split()。
其他符号
Symbol.hasInstance
确定构造函数对象是否将对象识别为其实例的方法。通常使用instanceof。
Symbol.isConcatSpreadable
一个布尔值,指示对象是否应平铺到其数组元素。 通常使用Array.prototype.concat()。
Symbol.unscopables
一个对象的值,其自己的和继承的属性名称被排除在关联对象的with环境绑定之外。
Symbol.species
用于创建派生对象的构造函数。
Symbol.toPrimitive
将对象转换为原始值的方法。
Symbol.toStringTag
用于默认描述对象的字符串值。 通常使用Object.prototype.toString()。
方法
Symbol.for(key)
用给定键搜索现有符号,如果找到则返回它。 否则,使用该键在全局符号注册表中创建一个新符号。
Symbol.keyFor(sym)
从全局符号注册表中为给定符号检索共享符号密钥。
Symbol prototype(符号原型)
1 | undefined |
属性
Symbol.prototype.constructor
返回创建实例原型的函数。 这是默认的符号功能。
方法
Symbol.prototype.toSource()
返回包含Symbol对象源的字符串。 重写Object.prototype.toSource()方法。
Symbol.prototype.toString()
返回包含符号描述的字符串。 重写Object.prototype.toString()方法。
Symbol.prototype.valueOf()
返回Symbol对象的原始值。 重写Object.prototype.valueOf()方法。
Symbol.prototype[@@toPrimitive]
返回Symbol对象的原始值。
示例
- 使用typeof查看Symbol的类型
1 | typeof Symbol() === 'symbol' // true |
符号类型转换
- 当我们试图把Symbol类型转为Number类型是将抛出TypeError
- 双等判断,Object(sym) == sym,将返回true
- Symbol(“foo”) + “bar”, 抛出TypeError,(不能讲Symbol类型转为String类型)。防止从Symbol类型创建一个String类型
- 通过String(sym)转换一个Symbol类型sym相当于调用Symbol.prototype.toString()。将抛出Symbol(sym)
符号类型和 for…in 迭代
1 | var obj = {}; |
- 符号类型和 JSON.stringify()
1 | JSON.stringify({[Symbol('foo')]: 'foo'}); |
- 把符号类型作为对象的键。
1 | var sym = Symbol('foo'); |