Symbol作为构造函数以及Symbol()的方法用法:
let a1 = Symbol("lvzy");
let a2 = Symbol("lvzy");
console.log(a1 === a2); //false
//输出Symbol的描述
console.log(a1.description); //lvzy
//使用Symbol.for() 和 直接使用Symbol() 看着好像没有什么区别
//其实Symbol.for 会在内存当中帮我们记录,那么下次再用Symbol.for()
//定义相同的description的话,那么会在内存中直接拿过来,所以如果判断他们是否全等的话
//就全等了
let cms = Symbol.for("hdcms");
let edu = Symbol.for("hdcms");
console.log(cms); //Symbol(hdcms)
console.log(cms === edu); //true
console.log(Symbol.keyFor(cms));//hdcms
let b1 = Symbol("abc");
let b2 = Symbol("abc");
let b3 = Symbol("abc");
//Symbol.keyFor()会在全局Symbol中查找,就是用Symbol.for()定义的Symbol才可以找到
console.log(b1);//Symbol(abc)
console.log(Symbol.keyFor(b1));//undefined
使用Symbol解决字符串耦合问题:
如果两个人的name相同,那么如果我们像这样定义的话,那么后者会覆盖前者的:
let user1 = {
name: "李四",
key: Symbol("李四")
};
let user2 = {
name: "李四",
key: Symbol("李四")
};
let grade = {
[user1.name]: { js: 100, css: 99 },
[user2.name]: { js: 99, css: 99 }
};
console.log(grade);
// { '李四': { js: 99, css: 99 } }
我们就可以利用Symbol类型的唯一性来解决对象的属性名相同的问题:
let user1 = {
name: "李四",
key: Symbol("李四")
};
let user2 = {
name: "李四",
key: Symbol("李四")
};
let grade = {
[user1.key]: { js: 100, css: 99 },
[user2.key]: { js: 99, css: 99 }
};
console.log(grade);
// {
// [Symbol(李四)]: { js: 100, css: 99 },
// [Symbol(李四)]: { js: 99, css: 99 }
// }
Symbol在缓存容器中的使用:
如果我们使用简单的字符串作为name传到容器中,因为name重复了,所以会出现覆盖
//定义一个缓存
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.name, user);
Cache.set(cart.name, cart);
console.log(Cache.get("apple"));
//{ name: 'apple', desc: '购物车', key: Symbol(购物车) }
那么我们可以用Symbol的唯一性,就不用担心字符串相同的问题。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(user.key));
console.log(Cache.get(cart.key));
// { name: 'apple', desc: '用户', key: Symbol(用户) }
// { name: 'apple', desc: '购物车', key: Symbol(购物车) }