ES6 新增 Symbol 用于防止属性名冲突 Symbol 的值是唯一的,是独一无二、不会重复的
* Symbol 不支持 new 关键字
声明定义
Symbol(description)
**params**
{ String } description 描述,用于描述 Symbol,方便分辨 Symbol**return**
{ Symbol }
var sym = Symbol();
var sym1 = Symbol("Hello");
var sym2 = Symbol("World");
console.log(sym); // Symbol()
console.log(sym1 === sym2); // false
* Symbol 不可以添加属性
var symbol = Symbol();
symbol.name = "zhangsan";
console.log(symbol.name); // undefined
描述
sym.description
**_desc_**
获取 Symbol 的描述
**return**
{ string } symbol 描述
var sym = Symbol("Hello World");
var description = sym.description;
console.log(description); // "Hello World"
Symbol.for(description)
* 如果不存在,则新建一个 Symbol
* Symbol.for 会在系统中登记 Symbol,使用 Symbol 不会登记
**_desc_**
根据描述获取 Symbol**params**
{ String } description 描述**return**
{ Symbol }
var sym1 = Symbol.for("Hello");
var sym2 = Symbol.for("Hello");
console.log(sym1 === sym2); // true
Symbol.keyFor(sym)
* 如果不存在,则返回 undefined
* Symbol.keyFor 根据描述寻找通过 Symbol.for 创建的已登记的 Symbol
**_desc_**
获取**系统已登记**的 Symbol 的描述**params**
{ Symbol } sym**return**
{ string | undefined }
var sym1 = Symbol("Hello");
var sym2 = Symbol.for("World");
console.log(Symbol.keyFor(sym1)); // undefined
console.log(Symbol.keyFor(sym2)); // "World"
对象属性
* Symbol 是独一无二的,可以保证对象属性的唯一性
Symbol 声明和方法使用 *[]
(变量)操作,不能使用 .
** 操作,点语法是操作字符串属性的
var nameSymbol = Symbol("name");
var ageSymbol = Symbol("age");
var obj = {
[nameSymbol]: "zhangsan",
[ageSymbol]: 18
};
console.log(obj[nameSymbol]); // zhangsan
console.log(obj.age); // undefined
遍历
* Symbol 不能使用 for/in、for/of 遍历操作
Object.getOwnPropertySymbols()
* 详见 引用类型 - 对象 Object - 枚举遍历
**
Reflect.ownKeys(obj)
* 详见 引用类型 - 对象 Object - 枚举遍历