ES6 - Symbol

是一种新的原始数据类型
可以作为对象的 key,保证属性名不会发生冲突

创建 Symbol:

let s = Symbol();

Symbol 函数可以接受一个字符串作为参数,表示对 Symbol 实例的描述,主要是为了在控制台显示,或者转为字符串时,比较容易区分。

let s1 = Symbol('foo');
s1 // Symbol(foo)
s1.toString() // "Symbol(foo)"

Symbol 类型还可以用于定义一组常量,保证这组常量的值都是不相等的

实例:消除魔术字符串

const shapeType = {
  triangle: Symbol()
};

function getArea(shape, options) {
  let area = 0;
  switch (shape) {
    case shapeType.triangle:
      area = .5 * options.width * options.height;
      break;
  }
  return area;
}

getArea(shapeType.triangle, { width: 100, height: 100 });

属性名的遍历

Symbol 作为属性名,该属性不会出现在 for...in、for...of 循环中,也不会被 Object.keys() 等方法返回
Object.getOwnPropertySymbols 方法,可以获取指定对象的所有 Symbol 属性名

Symbol.for(),Symbol.keyFor()

Symbol.for() 接受一个字符串作为参数,然后搜索有没有以该参数作为名称的 Symbol 值。如果有,就返回这个 Symbol 值,否则就新建并返回一个以该字符串为名称的 Symbol 值。

let s1 = Symbol.for('foo');
let s2 = Symbol.for('foo');

s1 === s2 // true

Symbol.keyFor() 方法返回一个已登记的 Symbol 类型值的key。

let s1 = Symbol.for("foo");
Symbol.keyFor(s1) // "foo"

let s2 = Symbol("foo");
Symbol.keyFor(s2) // undefined

内置的 Symbol 值

Symbol.hasInstance 
指向一个内部方法。当其他对象使用instanceof运算符,判断是否为该对象的实例时,会调用这个方法
Symbol.isConcatSpreadable
Symbol.species 
Symbol.match 
Symbol.replace 
Symbol.search
Symbol.split 
Symbol.iterator 
Symbol.toPrimitive
Symbol.toStringTag
Symbol.unscopables

你可能感兴趣的:(ES6 - Symbol)