Symbol
是 Es6
中新增的一种数据类型。它属于是基本数据类型。
6-1.创建
js
// 不同于 String Number 的是,Symbol并不需要new符,直接作为函数调用即可
var symbol = Symbol()
console.log(symbol)
// Symbol函数支持一个参数,该Symbol的文本描述
var theName = Symbol('yxp')
console.log(theName)
// 即使参数相同,创建出来的symbol 也是不同的
var anotherName = Symbol('yxp')
console.log(theName === anotherName)
6-2.使用
每个从 Symbol()
返回的 symbol
值都是唯一的。
一个 symbol
值能作为对象属性的标识符;这是该数据类型仅有的目的。
js
// 1.可计算属性
var myName = Symbol('my name')
var obj = {
[myName]: 'yxp'
}
console.log(myName)
console.log(obj[myName])
// 2.Object.defineProperty
Object.defineProperty(obj, Symbol('my age'), {
value: 19,
writable: false,
enumerable: true,
configable: true
})
console.log(obj)
// 3.Object.defineProperties
var job = Symbol('my job')
Object.defineProperties(obj, {
[job]: {
value: 'programmer'
}
})
console.log(obj)
// tip: 注意,Object.keys和Object.getOwnPropertyNames都不能检索出对象中的symbol属性。
var keys = Object.keys(obj)
console.log(keys)
var propertyNames = Object.getOwnPropertyNames(obj)
console.log(propertyNames)
6-3.Object.getOwnPropertySymbols
6-4.全局注册表
由于利用 Symbol()
创建的值都是唯一,我们在某些需要访问的情况下,变得不便。
Es6
为此提供了全局注册表,即 Symbol.for()
。
js
// 与Symbol()相同的是,Symbol.for()也支持一个参数,其是对于该Symbol的文本描述。
var myName = Symbol.for('my name')
console.log(myName)
var anotherName = Symbol.for('my name')
console.log(myName === anotherName) // true
// 另外还有Symbol.keyFor(),可以用来检索对应的键值
console.log(Symbol.keyFor(myName)) // 'my name'
6-5.静态方法
这些静态方法,实际上是对于 JS
内部操作方法的暴露,以允许开发者能够自定义控制某些内部方法。笔者暂时罗列出来。
更详细的内容可见MDN上关于Symbol的专章。
Symbol.hasInstance
一个在执行instanceof
时调用的内部方法,用于检测对象的继承信息。Symbol.isConcatSpreadable
一个布尔值,用于表示当传递一个集合作为Array.prototype.concat()
方法的参数时,是否应该将集合内的元素规整到同一层级。Symbol.iterator
一个返回迭代器的方法。Symbol.match
一个在调用String.prototype.match()
方法时调用的方法,用于比较字符串。Symbol.replace
一个在调用String.prototype.replace()
方法时调用的方法,用于替换字符串的子串。Symbol.search
一个在调用String.prototype.search()
方法时调用的方法,用于在字符串中定位子串。Symbol.species
用于创建派生对象的构造函数。Symbol.split
一个在调用String.prototype.split()
方法时调用的方法,用于分割字符串。Symbol.toPrimitive
一个返回对象原始值的方法。Symbol.toStringTag
一个在调用Object.prototype.toString()
方法时使用的字符串,用于创建对象描述。Symbol.unscopables
一个定义了一些不可被with
语句引用的对象属性名称的对象集合。