Skip to content

第五章 Symbol

Symbol

相当于设置一个唯一的标识,来确认不同的数据。

定义Symbol之后,绝对不会有重复。

使用场景类似与字符串

生成一个永远不重复的数字或字符串

js
定义: let varibale = Symbol();
特性: 不可添加属性

方法: 1 Symbol()
let varibale = Symbol("content");
		console.log(varibale.description);
		打印出来是"content"
	  2 Symbol.for()
		核心是在内存中开辟一块新空间,在全局进行保存,将其content输入进内存空间内,使其唯一。 之后再次定义Symbol后会事先查找其内容在内存空间中是否有,如果有,传址。
        适用于Symbol反复被使用的场景。
        
      3查看内容: Symbol.keyFor(已被定义的Symbol变量)

Symbol使用场景

js
let user1 = "张三";
let user2 = "李四";
let grade = {
    张三:{js:100,css:99},
    张三:{js:22,css:15}
}
console.log(grade);

	 	*****对象里使用变量需要中括号*****
            
打印结果是user1:xxxx user2:xxxx,而我们想要的是将上边定义的变量传递过去。

类似这种情况下,后边会覆盖原先的内容,即出现相同部分数据但并非不同的时候,使用引用类型进行数据存放会导致数据丢失。这样的情况下,需要Symbol()这种唯一定义的数据类型。

修改以上代码:
let user1 = {
    name: "张三",
    key:Symbol();
}
let user2 = {
    name:"张三",
    key:Symbol();
}
let grade = {
    [user1.key] : {js:100,css:99},
    [user2.key] : {js:22,css:15}
}
console.log(grade)
此时将不会发生覆盖情况。

缓存

共享数据与模块:

​ 前端中分成各种不同的功能模块,每个模块会有各自获取到的数据,而这些数据在其它模块中也需要使用,所以需要把所有模块中获取的数据进行统一存放,而这个统一存放的地区就是缓存,用于存放所有数据,并进行共享。

js
情景2:用户数据被购物车数据覆盖(发生重复)
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:"用户资料"
};
let cart = {
    name:"apple",
    desc:"购物车"
}
Cache.set("apple",user);
Cache.set("apple",cart);

此时后边的购物车里的apple会覆盖上边user的apple

修改方法1:添加时,在名称前添加前缀Cache.set("user-apple",user);
Cache.set("cart-apple",cart);

修改方法2:(Symbol())
let user = {
    name:"apple",
    desc:"用户资料",
    key:Symbol("会员资料")
};
let cart = {
    name:"apple",
    desc:"购物车",
    key:Symbol("购物车数据")
}
Cache.set(user.key,user);
Cache.set(user.key,cart);

遍历

引用对象里包含Symbol,使用以往的forof和forin是无法遍历key值的

遍历Symbol类型需要用特殊方法:

js
方法1:只遍历Symbol属性
for (const key of Object.getOwnPropertySymbols())P{
    console.log(key)
}
方法2:遍历所有属性
for(const key of Reflect.ownKeys()){
    console.log(key)
}
js
let site = Symbol("a symbol")
        class User {
            constructor(name){
                this.name = name;
            this[site] = "yzh";
            }
            getName(){
                return `${this[site]} ${this.name}`;
            }
        }
        let user = new User("李四");
        console.log(user.getName())
小案例告诉我们,不想要公布的属性(不被普通方法就遍历到的属性)可以使用Symbol()对其唯一定位和隐藏。