一、symbol基础

1-1 symbol作用

  • symbol是ES6新增的一种基本数据类型,最大特点就是“独一无二”,作用就是防止属性命名冲突,覆盖
  • symbol的参数只是一个描述,并不会因为参数相同导致两个symbol相同!!
    1. // 没有参数的情况
    2. var s1 = Symbol();
    3. var s2 = Symbol();
    4. s1 === s2 // false
    5. // 有参数的情况
    6. var s1 = Symbol("foo");
    7. var s2 = Symbol("foo");
    8. s1 === s2 // false

    1-2 symbol使用方法

    1. let mySymbol = Symbol();
    2. // 第一种写法
    3. let a = {};
    4. a[mySymbol] = 'Hello!';
    5. // 第二种写法
    6. let a = { [mySymbol]: 'Hello!'};
    7. // 第三种写法
    8. let a = {};
    9. Object.defineProperty(a, mySymbol, { value: 'Hello!' });
    10. // 以上写法都得到同样结果
    11. a[mySymbol] // "Hello!"

    二、symbol特性

  1. Symbol 值通过 Symbol 函数生成,使用 typeof,结果为 “symbol”
  2. Symbol 函数前不能使用 new 命令,否则会报错。这是因为生成的 Symbol 是一个基本数据类型的值,不是对象。
  3. instanceof Symbol的结果为 false
  4. Symbol 可以接受一个参数作为自己的描述

    1. // 参数为字符串
    2. var s1 = Symbol('foo');
    3. console.log(s1); // Symbol(foo)
    4. // 参数为对象,会先调用该对象的toString方法,转为字符串
    5. const obj = {
    6. toString() {
    7. return 'abc';
    8. }
    9. };
    10. const sym = Symbol(obj);
    11. console.log(sym); // Symbol(abc)
  5. Symbol 值不能与其他类型的值进行运算,会报错。

  6. Symbol 值可以显式转为字符串。

    1. var sym = Symbol('My symbol');
    2. console.log(String(sym)); // 'Symbol(My symbol)'
    3. console.log(sym.toString()); // 'Symbol(My symbol)'
  7. Symbol 作为属性名(key值),该属性不会被 for…in 循环枚举,也不会被 Object.keys()、Object.getOwnPropertyNames()、JSON.stringify() 返回。但是,它也不是私有属性,有一个 Object.getOwnPropertySymbols 方法,可以获取指定对象的所有 Symbol 属性名。 ```javascript var obj = {}; var a = Symbol(‘a’); var b = Symbol(‘b’);

obj[a] = ‘Hello’; obj[b] = ‘World’;

var objectSymbols = Object.getOwnPropertySymbols(obj);

console.log(objectSymbols); // [Symbol(a), Symbol(b)]

  1. 8. 生成同一个Symbol值可以使用Symbol.for,它接受一个字符串作为参数,然后搜索有没有以该参数作为名称的 Symbol 值。如果有,就返回这个 Symbol 值,否则就新建并返回一个以该字符串为名称的 Symbol 值。
  2. ```javascript
  3. var s1 = Symbol.for('foo');
  4. var s2 = Symbol.for('foo');
  5. console.log(s1 === s2); // true
  1. Symbol.keyFor 方法返回一个已登记的 Symbol 类型值的 key ```javascript var s1 = Symbol.for(“foo”); console.log(Symbol.keyFor(s1)); // “foo”

var s2 = Symbol(“foo”); console.log(Symbol.keyFor(s2) ); // undefined ```