[JavaScript] 好用的 JavaScript Symbol 类型

news/2024/11/17 22:46:23/

初识Symbol

  • 什么是Symbol?
  • 可以理解它为一个标识,一般情况下用来解决重名问题。
let hd = Symbol('hello,dust.')
let edu = Symbol('good afternoon')
console.log(hd == edu) //false
  • 一个Symbol要反复使用可以用Symbol.for定义
let a = Symbol.for('good morning')
let b = Symbol.for('good morning')
console.log(a) //Symbol(good morning)
console.log(a == b) //true
console.log(Symbol.keyFor(a)) //good morning
  • 当我们要从一个对象中取值时:
  • 假设这个班上有两个李四,我们要把学生名字作为key,怎么办?
  • 一般情况:
let user1 = '李四'
let user2 = '李四'
let grade = {user1: { js: 100, css: 89 },user2: { js: 100, css: 89 },
}
console.log(grade) //{ user1: { js: 100, css: 89 }, user2: { js: 100, css: 89 } }
let grade2 = {[user1]: { js: 100, css: 89 },[user2]: { js: 70, css: 55 },
}
console.log(grade2) //{ '李四': { js: 70, css: 55 } }
  • 用了Symbol的情况:
let user1 = {name: '李四',key: Symbol(),
}
let user2 = {name: '李四',key: Symbol(),
}
let grade = {[user1.key]: { js: 100, css: 89 },[user2.key]: { js: 35, css: 55 },
}
console.log(grade)
//{ [Symbol()]: { js: 100, css: 89 }, [Symbol()]: { js: 35, css: 55 } }
console.log(grade[user1.key]) //{ js: 100, css: 89 }
  • Symbol就相当于生成一个永远不会重复的字符串
let user = {name: 'cat',desc: '用户资料',key: Symbol('user'),
}
let cart = {name: 'apple',desc: '购物车',key: Symbol('购物车数据'),
}
Cache.set(user.key, user)
Cache.set(cart.key, cart)
console.log(Cache.get(cart.key))
//{ name: 'apple', desc: '购物车', key: Symbol(购物车数据) }

Symbol在类中的作用

class Cache {static data = {}static set(name, value) {return (this.data[name] = value)}static get(name) {return this.data[name]}
}
Cache.set('hello', 'dust')
console.log(Cache.get('hello')) //dust

另一个例子:

let site = Symbol('this is a Symbol')
class User {constructor(name) {this.name = namethis[site] = 'dust'}getName() {return `${this[site]} ${this.name}`}
}let v = new User('lisa')
console.log(v.getName()) //dust lisa
for (const key in v) {console.log(key) //name
}

几种取值的方式

let symbol = Symbol('这是一个Symbol类型')
let hd = {name: 'dust',[symbol]: 'hello',
}
for (const key of Object.keys(hd)) {console.log(key) //name
}
for (const key of Object.getOwnPropertySymbols(hd)) {console.log(key) //Symbol(这是一个Symbol类型)
}
for (const key of Reflect.ownKeys(hd)) {console.log(key)/*nameSymbol(这是一个Symbol类型)*/
}

http://www.ppmy.cn/news/607483.html

相关文章

数据湖(十七):Flink与Iceberg整合DataStream API操作

文章目录 Flink与Iceberg整合DataStream API操作 一、DataStream API 实时写入Iceberg表 1、首先在Maven中导入以下依赖

国民技术芯片相关产业研发

国民技术芯片相关产业研发 国民技术股份有限公司——塑造网络社会信息安全DNA,以原始创新技术满足人们安全便捷的网络生活需求。2000年公司成立,是承担国家“909”超大规模集成电路专项工程的集成电路设计企业之一。2010年4月在深圳创业板上市,股票代码300077,是中国上市公司协…

ajax交互扩展遇到的问题,ajax autocomplete扩展程序无法正常工作

我在文本框上有一个自动填充扩展器,它将记录显示为数据库中的列表,但是我点击了texbox并开始输入任何内容.我的HTML代码是Enabled"True" TargetControlID"TextBox1" ServicePath"~/WebService.asmx"ServiceMethod"GetCompletionList"M…

\r \r\n \t的区别

20220517 换行和回车的区别 - 知乎 \n 软回车: 在Windows 中表示换行且回到下一行的最开始位置。相当于Mac OS 里的 \r 的效果。 在Linux、unix 中只表示换行,但不会回到下一行的开始位置。\r 软空格: 在Linux、unix 中表示…

华为云服务功能总览

华为云服务功能总览 虚拟私有云 虚拟私有云(Virtual Private Cloud,以下简称VPC),为云服务器、云容器、云数据库等资源构建隔离的、用户自主配置和管理的虚拟网络环境,提升用户云上资源的安全性,简化用户的…

大数据必学Java基础(三十):IDEA的使用介绍

文章目录 IDEA的使用介绍 一、IDE ❀优点 ❀缺点 二、JetBrains公司介绍

不能从农行服务器获取配置文件,#新手入门#请问,农行网银用的好好的突然出现这个就不能用了怎么解决呢?谢谢...

负债类的会计科目有哪些 负债类的会计科目有哪些负债1 2101短期借款贷   负债1 2111应付票据贷   负债1 2121应付账款贷   负债1 2131预收账款贷   负债1 2141代销商品款贷   负债1 2151应付职工薪酬贷   负债2 215101应付工资、奖金、津贴和补贴贷   负债2 2151…

[JavaScript] Set类型在JavaScript中的使用

初识Set 在Set里,不能有重复的值。 let set new Set() set.add(1) set.add(1) console.log(set)运行结果: 修改一下 let set new Set() set.add(1) set.add(1) console.log(set)运行结果: 这里和对象进行一下比较:对象是不…