概述
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)]