js的Symbol
symbol 是一种基本数据类型(primitive data type)。Symbol()
函数会返回 symbol 类型的值,该类型具有静态属性和静态方法。它的静态属性会暴露几个内建的成员对象;它的静态方法会暴露全局的 symbol 注册,且类似于内建对象类,但作为构造函数来说它并不完整,因为它不支持语法:”new Symbol()
“。
每个从 Symbol()
返回的 symbol 值都是唯一的。一个 symbol 值能作为对象属性的标识符;这是该数据类型仅有的目的。更进一步的解析见—— glossary entry for Symbol。
1 | Symbol([description]) |
直接使用Symbol()
创建新的 symbol 类型,并用一个可选的字符串作为其描述。
description
:可选可选的,字符串类型。对 symbol 的描述,可用于调试但不是访问 symbol 本身。
1 | var sym1 = Symbol(); |
上面的代码创建了三个新的 symbol 类型。注意,Symbol("foo")
不会强制将字符串“foo”转换成 symbol 类型。它每次都会创建一个新的 symbol 类型:
1 | Symbol("foo") === Symbol("foo"); // false |
Symbol 值作为属性名时,该属性是公有属性不是私有属性,可以在类的外部访问。但是不会出现在 for...in
、 for...of
的循环中,也不会被 Object.keys()
、 Object.getOwnPropertyNames()
返回。如果要读取到一个对象的 Symbol
属性,可以通过 Object.getOwnPropertySymbols()
和 Reflect.ownKeys()
取到。