创建symbol的方式
let s = Symbol();
console.log(s, typeof s);
let s1 = Symbol('zhangsan');
let s2 = Symbol('zhangsan');
console.log(s1 === s2);
let s3 = Symbol.for('zhangsan');
let s4 = Symbol.for('zhangsan');
console.log(s3 === s4);
获取symbol的描述信息
let s = Symbol('zhangsan');
console.log(s.description);
注意事项
不能与其它数据类型进行运算
let s5 = Symbol.for('1');
s5 = s5 + 1;
值是唯一的?分情况!
let s1 = Symbol('zhangsan');
let s2 = Symbol('zhangsan');
let s3 = Symbol.for('zhangsan');
let s4 = Symbol.for('zhangsan');
console.log(s1 === s2);
console.log(s3 === s4);
不能用for-in遍历
let obj = {};
obj[Symbol("1")] = 1;
obj[Symbol("2")] = 2;
for (const key in obj) {
if (Object.hasOwnProperty.call(obj, key)) {
console.log(key);
const element = obj[key];
console.log(element);
}
}
可以使用Reflect.ownKeys来获取定义的对象的所有键名,从而来遍历对象
let obj = {};
obj[Symbol("1")] = 1;
obj[Symbol("2")] = 2;
obj.a = 3;
const result = Reflect.ownKeys(obj);
console.log(result);
for (const index of result) {
console.log(obj[index]);
}
应用场景
let obj = {
up() {
console.log("xiangshang");
},
down() {
console.log("xiangxia");
},
};
let symobj = {
up: Symbol(),
down: Symbol(),
};
obj[symobj.up] = function() {
console.log("我是新添加的up方法");
};
obj[symobj.down] = function() {
console.log("我是新添加的down方法");
};
console.log(obj);
obj[symobj.down]();