天天看点

ES6学习笔记——Symbol()

1.Symbol概述

        Symbol创建的是一个独一无二的值,没有具体的表现形式,但是通过typeof看到他的数据类型为symbol。

        Symbol函数可以接受参数,表示对于这个唯一值的描述。

ES6学习笔记——Symbol()

        每一个 Symbol 值都是不相等的,这意味着 Symbol 值可以作为标识符,用于对象的属性名,就能保证不会出现同名的属性。这对于一个对象由多个模块构成的情况非常有用,能防止某一个键被不小心改写或覆盖。

let sy1 = Symbol('sy1');
let sy2 = Symbol('sy2');
console.log(sy1, sy2);//Symbol(sy1) Symbol(sy2)
console.log(sy1 == sy2);//false

// API
// .for会到全局注册表中查找,是否有'sy3'这个key值,
// 如果有,将该key值对应的symbol值返回,
// 如果没有,新建一个symbol值
let sy3 = Symbol.for('hello');
let sy4 = Symbol.for('sy3');
console.log(sy3, sy4);//Symbol(hello) Symbol(sy3)
console.log(sy3 == sy4);//false

// .keyFor
let key = Symbol.keyFor(sy3);
console.log(key);//hello

// 应用 => 对象的属性名
let obj = {
  [sy2]: 'nihao'
}
obj[sy1] = 'hello world'
console.log(obj);//{ [Symbol(sy2)]: 'nihao', [Symbol(sy1)]: 'hello world' }
           
ES6学习笔记——Symbol()

2.Symbol()与Symbol.for()都会生成新的Symbol。

        区别:Symbol.for()会被登记在全局环境中供搜索,而Symbol()不会。

        Symbol.for()不会每次调用就返回一个新的 Symbol 类型的值,而是会先检查给定的key是否已经存在,如果不存在才会新建一个值。

        Symbol.for()为 Symbol 值登记的名字,是全局环境的,不管有没有在全局环境运行。

        正如下图所示,创建相同的Symbol,Symbol(‘hhh’)就不相同,因为Symbol()没有登记机制,每次调用都会返回一个不同的值

ES6学习笔记——Symbol()

3.Symbol.keyFor()方法返回一个已登记的 Symbol 类型值的key。

ES6学习笔记——Symbol()

4.Symbol应用(消除魔术字符串)

Symbol 值可以作为标识符,用于对象的属性名,就可以应用到消除魔术字符串。

        魔术字符串:在代码中重复出现的同样的字符串或数值。

        消除魔术字符串:用变量来代替重复出现的值

存在魔术字符串的代码块:

        这里case条件中的值就是魔术字符串,因为case后面需要不断出现判断数值。当后期需要更改判断条件的时候,需要一个个进行更改,这样的写法很不利于修改和维护。

function myFun (param) {
  switch (param) {
    case "1":
      console.log(1);
      break;
    case "2":
      console.log(2);
      break;
    case "3":
      console.log(3);
      break;
    default:
      console.log(0);
      break;
  }
}
myFun("1");
           

        将上面case后面的数值用变量来代替,并且将每一个变量的值设为Symbol(),这样不管attr1、attr2、attr3的值是什么,Symbol()就保证了他们不会对彼此的值起冲突

消除魔术字符串的代码块:

let obj = {
  attr1: Symbol(),
  attr2: Symbol(),
  attr3: Symbol(),
}

function myFun (param) {
  switch (param) {
    case obj.attr1:
      console.log(1);
      break;
    case obj.attr2:
      console.log(2);
      break;
    case obj.attr3:
      console.log(3);
      break;
    default:
      console.log(0);
      break;
  }
}
myFun(obj.attr1);
           
ES6学习笔记——Symbol()

继续阅读