Symbol数据类型的使用


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)
}

文章作者: iamfugui
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 iamfugui !
评论
  目录