Axıs
目录

第五章 Symbol

第五章 Symbol

Symbol

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

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

使用场景类似与字符串

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

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

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

缓存

共享数据与模块:

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

情景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类型需要用特殊方法:

方法1:只遍历Symbol属性
for (const key of Object.getOwnPropertySymbols())P{
    console.log(key)
}
方法2:遍历所有属性
for(const key of Reflect.ownKeys()){
    console.log(key)
}
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()对其唯一定位和隐藏。