symbol 是一种基本数据类型. 每个从Symbol()
返回的symbol值都是唯一的。一个symbol值能作为对象属性的标识符;这是该数据类型仅有的目的。
//向对象中添加方法 up down
let game = {
name:'俄罗斯方块',
up: function(){},
down: function(){}
};
// 声明一个对象
let methods = {
up: Symbol(),
down: Symbol()
};
game[methods.up] = function(){
console.log("我可以改变形状");
}
game[methods.down] = function(){
console.log("我可以快速下降!!");
}
game[methods.up]();
game[methods.down]();
let youxi = {
name:"狼人杀",
[Symbol.for('say')]: function(){
console.log("我可以发言")
},
[Symbol.for('zibao')]: function(){
console.log('我可以自爆');
}
}
console.log(youxi);
//Symbol.for('say')产生的标识是唯一的,所以可以调用定义在youxi里面的[Symbol.for('say')]方法
youxi[Symbol.for('say')]();
youxi[Symbol.for('zibao')]();
let youxi1 = {
name:"狼人杀",
[Symbol('say')]: function(){
console.log("我可以发言")
},
[Symbol('zibao')]: function(){
console.log('我可以自爆');
}
}
youxi[Reflect.ownKeys(youxi)[1]]();
youxi[Reflect.ownKeys(youxi)[2]]();
//静态方法 Reflect.ownKeys() 返回一个由目标对象自身的属性键组成的数组。
//这种情况无法直接调用,因为每次 Symbol("xxx") 都是不一样的
//因为Symbol('say')生成的标识不是唯一的,所以定义的在youxi1里面的[Symbol('say')]是无法调用的,除非把Symbol('say')放块外面定义,并用变量保存
console.log(Symbol('say')===Symbol('say')); //false
// youxi1[Symbol('say')](); //报错
// youxi1[Symbol('zibao')](); //报错
let S1=Symbol('CSDN')
let S2=Symbol('CSDN')
let S3=Symbol.for('CSDN')
let S4=Symbol.for('CSDN')
console.log(S1===S2)//false
console.log(S3===S4)//true
//因为Symbol('***')生成的标识不是唯一的,所以定义的S1不等于S2
// Symbol.for()与Symbol()这两种写法,都会生成新的 Symbol。
// 它们的区别是,前者会被登记在全局环境*搜索,后者不会。
//里面的***这个标志就像 你给代码写的注释一样