ES6 新增 Symbol 用于防止属性名冲突 Symbol 的值是唯一的,是独一无二、不会重复的

* Symbol 不支持 new 关键字

声明定义

Symbol(description)

**params** { String } description 描述,用于描述 Symbol,方便分辨 Symbol **return** { Symbol }

  1. var sym = Symbol();
  2. var sym1 = Symbol("Hello");
  3. var sym2 = Symbol("World");
  4. console.log(sym); // Symbol()
  5. console.log(sym1 === sym2); // false

* Symbol 不可以添加属性

  1. var symbol = Symbol();
  2. symbol.name = "zhangsan";
  3. console.log(symbol.name); // undefined

描述

sym.description

**_desc_** 获取 Symbol 的描述
**return** { string } symbol 描述

  1. var sym = Symbol("Hello World");
  2. var description = sym.description;
  3. console.log(description); // "Hello World"

Symbol.for(description)

* 如果不存在,则新建一个 Symbol
* Symbol.for 会在系统中登记 Symbol,使用 Symbol 不会登记

**_desc_** 根据描述获取 Symbol **params** { String } description 描述 **return** { Symbol }

  1. var sym1 = Symbol.for("Hello");
  2. var sym2 = Symbol.for("Hello");
  3. console.log(sym1 === sym2); // true

Symbol.keyFor(sym)

* 如果不存在,则返回 undefined
* Symbol.keyFor 根据描述寻找通过 Symbol.for 创建的已登记的 Symbol

**_desc_** 获取**系统已登记**的 Symbol 的描述 **params** { Symbol } sym **return** { string | undefined }

  1. var sym1 = Symbol("Hello");
  2. var sym2 = Symbol.for("World");
  3. console.log(Symbol.keyFor(sym1)); // undefined
  4. console.log(Symbol.keyFor(sym2)); // "World"

对象属性

* Symbol 是独一无二的,可以保证对象属性的唯一性
Symbol 声明和方法使用 *[] (变量)操作,不能使用 .** 操作,点语法是操作字符串属性的

  1. var nameSymbol = Symbol("name");
  2. var ageSymbol = Symbol("age");
  3. var obj = {
  4. [nameSymbol]: "zhangsan",
  5. [ageSymbol]: 18
  6. };
  7. console.log(obj[nameSymbol]); // zhangsan
  8. console.log(obj.age); // undefined

遍历

* Symbol 不能使用 for/in、for/of 遍历操作

Object.getOwnPropertySymbols()

* 详见 引用类型 - 对象 Object - 枚举遍历
**

Reflect.ownKeys(obj)

* 详见 引用类型 - 对象 Object - 枚举遍历