1. Symbol会生成唯一值;
把symbol想象成唯一值的字符串
let s1 = Symbol();
let s2 = Symbol();
s1 == s2 //false
2. 描述
//定义描述
let s1 = Symbol("吃了吗");//有描述
//获取描述
s1.description //吃了吗
3. Symbol全局注册
Symbol.for(key) 方法会根据给定的键 key,来从运行时的 symbol 注册表中找到对应的 symbol,如果找到了,则返回它,否则,新建一个与该键关联的 symbol,并放入全局 symbol 注册表中。——MDN
3.1 复用
let s1 = Symbol.for("name");//有描述
let s2 = Symbol.for("name");//有描述
s1 == s2 //true
3.2 获取描述
let s1 = Symbol.for("name");
//获取描述
Symbol.keyFor(s1);
4. 使用场景
(1)解决对象属性的耦合问题
成绩重名问题
let user1 = {name:"李四",key:Symbol()}
let user2 = {name:"李四",key:Symbol()}
let grade = {
[user1.key]:{js:100,css:80},
[user1.key]:{js:80,css:60}
}
console.log(grade[user1.key]);//这样就可以根据key的Symbol值获取成绩
(2)Symbol在缓存容器中的使用
缓存
class Cache(){
static data = {};
static set(name,value){
return (this.data[name] = value);
};
static get(name){
return this.data[name];
}
}
let user ={
name : "apple",
desc : "用户资料",
key:Symbol("用户资料数据")
}
let cart ={
name : "apple",
desc : "购物车",
key:Symbol("购物车数据")
}
Cache.set(user.key,user);
Cache.set(cart.key,cart);
console.log(Cache.get(cart.key))
4. Symbol特性与对象属性保护
(1) 无法直接遍历
//for...in 和 for...of都不行
//理解成Symbol是私有属性
let symbol = Symbol("这是一个Symbol类型")
let obj = {
name:"周贵",
[symbol]:"24是学生"
}
//这里只能遍历到name
for(let key in obj){
console.log(key)
}
(2) 如何非直接的,遍历?
Object.getOwnPropertySymbols()
这样只能遍历对象中的symbol属性
let symbol = Symbol("这是一个Symbol类型")
let obj = {
name:"周贵",
[symbol]:"24是学生"
}
let symbols = Object.getOwnPropertySymbols(obj)
for(let key of symbols){
console.log(obj[key])
}
(3) Reflect.ownKeys 遍历全部属性
let symbol = Symbol("这是一个Symbol类型")
let obj = {
name:"周贵",
[symbol]:"24是学生"
}
for(let key of Reflect.ownKeys(obj)){
console.log(key)
}