Javascript教程第五章:带你走进Symbol的世界
Javascript教程第五章:带你走进Symbol的世界
一.Symbol
1.Symbol使用场景介绍
Symbol:符号,为数据添加特征,方便辨认
2.声明定义Symbol的几种方式
let num1 = Symbol()
let num2 = Symbol()
console.log(num1 == num2); //返回false,不同内存地址
使用Symbol.for(description)创建的时候会先在内存中寻找,有则指向同一个内存地址,没有则新创建,类似于Java的变量池
let hd = Symbol("Tsy");
let hde = Symbol.for("Tsy")
let hdes = Symbol.for("Tsy")
console.log(hde == hdes);
console.log(hd.description);
3.使用Symbol解决字符串耦合问题
let grade = {
李四: {js:120,html:80},
李四: {js:80,html:70}
}
console.log(grade.李四)
当我们使用以上方式来保存学生成绩的时候,如果姓名出现重复,那么会覆盖掉上面的成绩
我们在俩个学生中加上key,利用Symbol来区分
let use1 = {
name : "李四",
key : Symbol()
}
let use2 = {
name : "李四",
key : Symbol()
}
let grade = {
[use1.key]: {js:120,html:80},
[use2.key]: {js:80,html:70}
}
console.log(grade[use1.key])
4.Symbol在缓存容器中的使用
1.Object.getOwnPropertySymbols()
2.Reflect.ownKeys()
//生成一个永远不会重复的字符串
//Symbol类似与私有属性,在外部无法进行遍历
//强制访问可以使用Object.getOwnPropertySymbols()方法
let symbol = Symbol("这是一个Symbol")
let use1 = {
name : "李四",
key : Symbol(),
[symbol]:"houdunren.com"
}
//当我们把Symbol当作属性名使用的时候,无法访问到属性,因为Symbol类似与私有属性,利用该特性可以保护数据,在外部访问的时候是访问不到的
//当我们需要遍历use1中的所有属性时(包括Symbol属性),我们这样做:
for (const value of Reflect.ownKeys(use1)) {
console.log(value)
}