概述

Symbol 值通过Symbol函数生成。这就是说,对象的属性名现在可以有两种类型,一种是原来就有的字符串,另一种就是新增的 Symbol 类型。凡是属性名属于 Symbol 类型,就都是独一无二的,可以保证不会与其他属性名产生冲突。Symbol的引入是为了保证属性名的独一无二。

Symbol.prototype.description

创建 Symbol 的时候,可以添加一个描述。但是,读取这个描述需要将 Symbol 显式转为字符串。

const sym = Symbol('foo');
sym.description // "foo"

作为属性名的Symbol

let mySymbol = Symbol();
// 第一种写法
let a = {};
a[mySymbol] = 'Hello!';
// 第二种写法
let a = {
  [mySymbol]: 'Hello!'
};
// 第三种写法
let a = {};
Object.defineProperty(a, mySymbol, { value: 'Hello!' });
// 以上写法都得到同样结果
a[mySymbol] // "Hello!"

当一个Symbol对象作为一个对象的key时,不可以用.语法访问必须 a[mySymbol]

属性名的遍历

Symbol作为属性名,不能用常规的for...of、for...in进行遍历,有一个Object.getOwnPropertySymbols方法,可以获取指定对象的所有 Symbol 属性名。

const obj = {};
let a = Symbol('a');
let b = Symbol('b');

obj[a] = 'Hello';
obj[b] = 'World';

const objectSymbols = Object.getOwnPropertySymbols(obj);

objectSymbols
// [Symbol(a), Symbol(b)]