Skip to content

SymbolEs6 中新增的一种数据类型。它属于是基本数据类型。

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 语句引用的对象属性名称的对象集合。