//ES6新增数据类型Symbol Set(new) Map(new)
// Symbol不能用new关键字(提出:解决属性名重复导致属性值被覆盖的问题)
// Symbol表示唯一性 既不相等也不全等
console.log(NaN === NaN);
console.log(Symbol('') === Symbol(''));
// 参数作为修饰(代表性) 避免混淆
console.log(Symbol('pg') === Symbol('sg'));
// Symbol 作为属性对象
var s = Symbol()
var obj = {
[s]:'A'
}
var person = {
name:'小明',
age:12,
[Symbol('level')]:'A'
}
for(var i in person){
// Symbol属性打印不出来
console.log(i);
}
// 并不具备迭代器的接口 Symbol.iterator 会报错
// for(var i of person){
// console.log(i);
// }
console.log(Object.keys(person));
console.log(Object.getOwnPropertySymbols(person));
// 返回目标对象自身属性键的数组
console.log(Reflect.ownKeys(person));
console.log(Object.getOwnPropertyNames(person));
//为了重新使用同一个Symbol值 使用Symbol.for()方法实现
let s1 = Symbol.for('foo')
let s2 = Symbol.for('foo') //在创建前在全局中寻找有没有用Symbol.for并且key是foo的字符窜创建Symbol,有则不再创建直接使用
console.log(s1 === s2); //true
// 返回已登记的Symbol类型值的key
Symbol.keyFor(s1) //foo
// Symbol的使用场景
// var game = {
// pg:'控球后卫',
// sg:'得分后卫',
// sf:'小前锋'
// }
var game = {
pg:Symbol('pg'),
sg:Symbol('sg'),
sf:Symbol('sf')
}
function createRole(type){
if(type === game.pg){
console.log('控球后卫');
}else if(type === game.sg){
console.log('得分后卫');
}else if(type === game.sf){
console.log('小前锋');
}
}
// createRole('控球后卫')
createRole(game.pg)