ES6 引入了一种新的原始数据类型 Symbol,表示独一无二的值
1.symbol的值是唯一的 用来解决命名冲突的问题
let s = Symbol()
console.log(s)//Symbol()----红色字体
console.log(typeof s)//symbol----黑色字体
// 参数是用来给程序员做提醒,提醒程序员symbol代表的是谁
let s = Symbol("小红");
let body = Symbol("小红");
console.log(s === body);//false
console.log(s == body);//false
2. symbol不能与其他数据进行运算
let s3 = Symbol(123);
console.log(s3);//Symbol(123)
console.log(s3+11);//Uncaught TypeError: Cannot convert a Symbol value to a number
给对象设置独一无二的属性
方法1:在外部给对象添加属性
let game = {
name:'俄罗斯方块',
};
// 声明一个symbol的值
let up = Symbol("up");
let up1 = Symbol("up");
// 把Symbol的值 作为对象的属性 给对象添加上去
game[up] = function(){//game[up]=game[" Symbol("up")"];
给对象添加属性 可以用[],.不行 因为[]可以是把变量的值当做属性名添加上去。
而.是把变量名当做属性名添加上去
console.log("上1");
};
game[up1] = function(){
console.log("上2");
};
//调用这些方法的时候 也必须用[],[]会把变量的值作为属性名,
而.会把变量名作为真实的属性名调用.调用出来的结果就是undefined
game[up]();//上1
game[up1]();//上2
方法2:在对象内部直接添加属性
//声明一个Symbol的值
let down = Symbol("down");
let down1 = Symbol("down")
let game1 = {
name: '俄罗斯方块',
// 把Symbol的值 作为对象的属性 给对象添加上去
[down]:function(){//属性名真实是这个-->Symbol("down")
console.log("下1");
},
down:function(){
console.log("下");
},
[down1]:function(){//属性名真实是这个-->Symbol("down")
console.log("下2");
},
down:function(){//会覆盖操作 而Symbol不会
console.log("下down");
}
};
game1[down]();//下1
game1.down();//下down
game1[down1]();//下2
game1["down"]();//下down
我们可能疑惑为什么要加[down]和[down1],直接down和down1不就行了,或者说为什么学Symbol 不是更麻烦了么?
因为在实际项目中,我们是多人协作,有人负责俄罗斯方块的下的动作,有人负责俄罗斯方块向下的动作特效,
俩个人在操作game这个对象时 在添加对象方法时都想叫down是不是会发生属性同名,进行覆盖。
那么Symbol的强大的功能就体现出来了。