Skip to main content

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)
}