第五章 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()对其唯一定位和隐藏。