1.Symbol概述
Symbol创建的是一个独一无二的值,没有具体的表现形式,但是通过typeof看到他的数据类型为symbol。
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' }
2.Symbol()与Symbol.for()都会生成新的Symbol。
区别:Symbol.for()会被登记在全局环境中供搜索,而Symbol()不会。
Symbol.for()不会每次调用就返回一个新的 Symbol 类型的值,而是会先检查给定的key是否已经存在,如果不存在才会新建一个值。
Symbol.for()为 Symbol 值登记的名字,是全局环境的,不管有没有在全局环境运行。
正如下图所示,创建相同的Symbol,Symbol(‘hhh’)就不相同,因为Symbol()没有登记机制,每次调用都会返回一个不同的值
3.Symbol.keyFor()方法返回一个已登记的 Symbol 类型值的key。
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);