ES6中我们新加入了Symbol作为数据类型,来表示独一无二的值。书中介绍如果我们使用他人提供的对象,但又想为对象添加新的方法,但是新方法的名字可能和之前的发生冲突,为了保证属性名字的独一无二Symbol就产生了。
//Symbol是一种类似于字符串形式的数据类型。
//接受一个字符串作为参数。
const l = Symbol('dog')
console.log(l) //Symbol(dog)
// Symbol 不能参与运算
//console.log(l+1); // Cannot convert a Symbol value to a number
//就算带有相同参数的Symbol返回值都不相等
const m = Symbol('dog')
console.log(m===l); // false
//当Symbol作为属性的标识符时不能使用点运算符
// 因为点运算符后面接字符串所以n的属性名是字符串不是Symbol
const n = {}
const o = Symbol();
const p = Symbol();
n.o = 'ddw';
n[p] = 'ddw2'
console.log(n[o]); // undefined
console.log(n[p]); // ddw2
//所以在对象内部时我们必须加方括号要不然就是字符串了
const q = Symbol();
const r = Symbol('ddw');
let s = {
[p]: 1,
q:2
}
console.log(s); //q: 2 Symbol(): 1
// 当然我们也可以消除魔术字符串
const test1 = (para) => {
switch (para) {
case 'gongdaye':
console.log('ddw1');
break;
case 'wangdaye':
console.log('ddw2');
break;
}
}
test1('gongdaye') //此时出现具体字符串我们需要消除
const dayeType = {
gongdaye: Symbol(),
wangdaye: Symbol()
}
const test2 = (para) => {
switch (para) {
case dayeType.gongdaye:
console.log('ddw1');
break;
case dayeType.wangdaye:
console.log('ddw2');
break;
}
}
test2(dayeType.wangdaye)
//Symbol作为属性名只能被Object.getOwnPropertySymbols返回
console.log(Object.getOwnPropertySymbols(s))
网友评论