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)); // undefinedconsole.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]); // zhangsanconsole.log(obj.age); // undefined
遍历
* Symbol 不能使用 for/in、for/of 遍历操作
Object.getOwnPropertySymbols()
* 详见 引用类型 - 对象 Object - 枚举遍历
**
Reflect.ownKeys(obj)
* 详见 引用类型 - 对象 Object - 枚举遍历
