js中Symbol数据类型笔记

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(购物车) }

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值