概述
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)]
京公网安备 11010502036488号