Symbol 类型
- ES6 引入了一种新的原始数据类型 Symbol ,表示独一无二的值,最大的用法是用来定义对象的唯一属性名。
- ES6 数据类型除了 Number 、 String 、 Boolean 、 Objec t、 null 和 undefined ,还新增了 Symbol 。
Symbol 定义方式
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 
 | let sy = Symbol("这是第一个symbol");let newsy = Symbol();
 console.log(typeof sy);
 
 console.log(sy.toString());
 
 
 console.log(sy.description);
 
 let hd = Symbol.for("Symbol for 的方式定义symbol");
 
 console.log(Symbol.keyFor(hd));
 
 | 
Symbol 解决数据重复覆盖问题
在对象中如果 key 名重复,后面的 key 会把前面的 key 覆盖掉,使用 symbol 类型定义唯一值,可以避免覆盖问题
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 
 | let user1 = {name: "李四",
 key: Symbol(),
 };
 let user2 = {
 name: "李四",
 key: Symbol(),
 };
 let grade = {
 [user1.key]: { js: 99, css: 89 },
 [user2.key]: { js: 56, css: 100 },
 };
 console.log(grade[user2.key]);
 
 | 
Symbol 在缓存器中的使用
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 
 | class Cache {static data = {};
 static set(name, value) {
 this.data[name] = value;
 }
 static get(name) {
 return this.data[name];
 }
 }
 
 let user = {
 name: "xiaomi",
 key: Symbol(),
 };
 let cart = {
 name: "xiaomi",
 key: Symbol(),
 };
 
 Cache.set(user.key, user);
 Cache.set(cart.key, cart);
 console.log(Cache.get(user.key));
 
 | 
扩展特性与对象属性保护
使用 symbol 定义 key 时不会被 for in 遍历到,通过 for of Reflect.ownKeys()可以遍历到对象里面的 symbol 属性
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 
 | let symbol = Symbol();let obj = {
 name: "李四",
 [symbol]: "张三",
 };
 
 for (let key in obj) {
 console.log(key);
 }
 
 
 for (let key of Reflect.ownKeys(obj)) {
 console.log(key);
 }
 
 let site = Symbol();
 class User {
 constructor(name) {
 this.name = name;
 this[site] = "songzheng";
 }
 getName() {
 return `${this.name} ${this[site]}`;
 }
 }
 
 let newuser = new User("6666");
 console.log(newuser.getName());
 
 
 for (let key in newuser) {
 console.log(newuser[key]);
 }
 
 |