simple's Studio.

ES6中的Symbol

2017/11/03

Symbols(标识符)
Symbol 是一种独特的且不可变的数据类型,经常用来标识对象属性。

要创建 Symbol,输入 Symbol(),并添加一个可选的字符串作为其描述。

const sym1 = Symbol('apple');
console.log(sym1);
Symbol(apple)

它将创建唯一的标识符,并将其存储在 sym1 中。描述 “apple” 只是用来描述标识符的一种方式,但是不能用来访问标识符本身。

为了展示它的工作原理,如果你对具有相同描述的两个标识符进行比较……

const sym2 = Symbol('banana');
const sym3 = Symbol('banana');
console.log(sym2 === sym3);
false

结果是 false,因为描述只是用来描述符号,它并不是标识符本身的一部分。无论描述是什么,每次都创建新的标识符。
当然,依然很难弄明白,所以,我们来看一个之前视频中的示例,看看标识符的作用。下面是代表该示例中的 bowl(碗)的代码。

const bowl = {
  'apple': { color: 'red', weight: 136.078 },
  'banana': { color: 'yellow', weight: 183.15 },
  'orange': { color: 'orange', weight: 170.097 }
};

碗中包含水果,它们是 bowl 的属性对象。但是,当我们添加第二个香蕉时,遇到了问题。

const bowl = {
  'apple': { color: 'red', weight: 136.078 },
  'banana': { color: 'yellow', weight: 183.151 },
  'orange': { color: 'orange', weight: 170.097 },
  'banana': { color: 'yellow', weight: 176.845 }
};
console.log(bowl);
Object {apple: Object, banana: Object, orange: Object}

新添加的香蕉将上一个香蕉覆盖了。为了解决该问题,我们可以使用标识符。

const bowl = {
  [Symbol('apple')]: { color: 'red', weight: 136.078 },
  [Symbol('banana')]: { color: 'yellow', weight: 183.15 },
  [Symbol('orange')]: { color: 'orange', weight: 170.097 },
  [Symbol('banana')]: { color: 'yellow', weight: 176.845 }
};
console.log(bowl);
Object {Symbol(apple): Object, Symbol(banana): Object, Symbol(orange): Object, Symbol(banana): Object}

通过更改 bowl 的属性并使用标识符,每个属性都是唯一的标识符,第一个香蕉不会被第二个香蕉覆盖。

CATALOG