ECMAScript 6 Symbol
ES6 引入了新的基本数据类型Symbol,对于每一个Symbol的实例都是唯一的。
Symbol('A') === Symbol('A'); // false对象的属性名现在可以是三种类型:
数字类型
字符串类型
Symbol实例
const obj = {
[1]: 1,
['a']: 'a',
[Symbol('A')]: 'symbol'
}
Symbol作为属性名,该属性不会被for...in、for...of遍历,Object.keys()、Object.getOwnPropertyNames()、JSON.stringify()也无法返回。只能通过Object.getOwnPropertySymbols()方法,获取指定对象的所Symbol属性名。
Symbol 函数不能使用 new 命令
const symbolA = new Symbol('A'); // TypeError: Symbol is not a constructorSymbol函数可以接受一个字符串作为参数作为对Symbol实例的描述,仅仅是描述。如果接受一个对象则会调用该对象的toString()方法。
const strSymbol = Symbol('A'); // Symbol(A)
const numSymbol = Symbol(1); // Symbol(1)
const boolSymbol = Symbol(true); // Symbol(true)
const obj = {
toString() {
return 'obj to string'
}
}
const objSymbol = Symbol(obj); // Symbol(obj to string)
const objSymbol2 = Symbol({}); // Symbol([object Object])
const arrSymbol = Symbol([1, 2]); // Symbol(1,2)Symbol实例不能转换成数值,所以不能进行数值运算
Symbol可以转为字符串或布尔值
相关API
Symbol.for
接受一个字符串,如果给定的 key 已经存在则返回现有的Symbol对象,如果不存在则返回一个新的Symbol实例.
Symbol.for()与Symbol()都能够产生新的Symbol。不过,Symbol.for()产生的实例会登记在全局环境中供搜索。
Symbol.keyFor
返回一个已登记的Symbol类型值的key
Symbol.hashInstance
Symbol.hasInstance()属性指向一个内部方法。当其他对象使用instanceof运算符,判断是否为该对象的实例时,会调用这个方法。
Symbol.isConcatSpreadable
对象使用Array.prototype.concat()时,是否允许展开
最后更新于