1.防止对象属性名或对象方法名冲突
比如,你使用了一个他人提供的对象,但又想为这个对象添加新的属性(方法),新属性(方法)的名字就有可能与现有属性(方法)产生冲突。
/* --不使用symbol情况下 --*/
//别人创建了一个对象obj
let obj = {
a:1,
b(){return 2}
}
obj.a //1
obj.b() //2
//你拿来使用然后创建一个a属性,一个b方法
obj.a=2;
obj.b = ()=>{retrun 3}
//导致覆盖了原有的属性a的值以及原有的方法b
obj.a //2
obj.b() //3
/* --使用symbol情况下 --*/
//别人创建了一个对象obj
let a = symbol('key_a');//属性值a
let b = symbol('function_b');//方法b
let obj = {
[a]:1,
[b](){return 2}
}
obj[a] //1
obj[b]() //2
//你拿来使用然后创建一个a属性,一个b方法
obj.a=2;
obj.b = ()=>{retrun 3}
//这操作不会导致覆盖原有的属性a的值以及原有的方法b
obj // {a: 2, b: ƒ, Symbol(key_a): 1, Symbol(function_b): ƒ}
obj[a] //1
obj.a //2
obj[b] //2
obj.b //3
2.消除魔术字符串
魔术字符串指的是,在代码之中多次出现、与代码形成强耦合的某一个具体的字符串或者数值。风格良好的代码,应该尽量消除魔术字符串,改由含义清晰的变量代替。
function getWeek(key) {
let day = '';
switch (key) {
case 'one' : // 魔术字符串
day = 'Monday' ;
break;
/* ... more code ... */
}
return area;
}
getWeek('one'); // 魔术字符串
上面代码中,字符串one就是一个魔术字符串。它多次出现,与代码形成“强耦合”,不利于将来的修改和维护。
常用的消除魔术字符串的方法,就是把它写成一个变量。
let dayType = {
one:'one',
...
}
function getWeek(key) {
let day = '';
switch (key) {
case dataType.one :
day = 'Monday' ;
break;
/* ... more code ... */
}
return area;
}
getWeek(dataType.one);
此时,若是变量过多,为了防止值重复冲突,也不用花精力进行赋值,使用symbol就可以设置唯一值了。
let dayType = {
one:symbol(),
tow:symbol(),
three:symbol(),
...
function getWeek(key) {
let day = '';
switch (key) {
case dataType[one] :
day = 'Monday' ;
break;
/* ... more code ... */
}
return area;
}
getWeek(dataType[one]);
}
网友评论