Symbol
Symbol 数据类型是ES6新出的一种数据类型,这种数据类型的特点就是没有重复的数据,可以作为Object 的 key(属性值)。
本篇博客为博主本人整理的Symbol数据类型的笔记,参考文档为《阮一峰的ECMAScript 6 入门》。
目录
1.Symbol() 构造函数
Symbol() 构造函数:
- 因为 Symbol 是一种原始数据类型,不是对象,因此构造函数前面不用加
new
。 - 基本上 Symbol 是一种类似字符串的数据类型。
1.1 Symbol(‘foo’) !== Symbol(‘foo’)
-
Symbol() 的参数只代表对于当前 Symbol 值的描述。且 Symbol() 的创建具有唯一性,因此:
let s1 = Symbol() let s2 = Symbol() console.log(s1===s2)//false let s3 = Symbol('foo') let s4 = Symbol('foo') console.log(s3===s4)//false
2.Symbol 的数据类型转换
- Symbol 的数据类型转换
-
Symbol 值不能于其他类型的值进行运算,会报错,如:
let s = Symbol('mySymbol') console.log('yourSymbol'+s) //TypeError: Cannot convert a Symbol value to a string
-
但是,Symbol 值可以显示转为字符串。如:
let s = Symbol('mySymbol') console.log(String(s)) //Symbol(mySymbol) console.log(s.toString()) //Symbol(mySymbol)
-
Symbol 也可以转换为布尔值。如:
let s = Symbol('mySymbol') console.log(Boolean(s)) //true
-
Symbol 不能转换为数值。如:
let s = Symbol('mySymbol') console.log(Number(s)) //TypeError: Cannot convert a Symbol value to a number
3.读取 Symbol 的描述信息
3.1方法一:显示转换为字符串
- 这个方法在上一小节提到了。对于
Symbol
数据类型的元素s
可以采用String(s)
或s.toString()
来读取Symbol
元素的描述。但是这种方法不是很方便。
let s = Symbol('mySymbol') console.log(String(s)) //Symbol(mySymbol) console.log(s.toString()) //Symbol(mySymbol)
3.2方法二:Symbol原型对象的description属性
Symbol.prototype.description
:Symbol
构造函数的原型对象上有一个description
属性,可以直接返回Symbol
值的描述。即对于Symbol
类型的元素s
,可以直接使用s.discription
获得 Symbol 值的描述。如:
let s = Symbol('mySymbol') console.log(s.description)//'mySymbol'
4.Symbol 值作为对象的属性名
Symbol 值作为对象的属性名的好处:每一个 Symbol 都是不相等的,用 Symbol 值作为对象的属性名,就可以保证不会出现同名的属性。
4.1 对象的 Symbol类型的属性名 的属性的【设置】
-
使用方括号
[ ]
,不能使用.
添加Symbol类型的属性名。因为.
点运算符后面跟的是字符串,如果用点运算符,则添加到对象中的属性的属性名是字符串's'
,而不是Symbol类型的s。let s = Symbol('mySymbol') let obj = { } obj[s]='hello' //或 let obj1 = { [s]:'hello' } console.log(obj) console.log(obj1)
4.2 对象的 Symbol类型的属性名 的属性值的【读取】
- 使用方括号
[ ]
对对象的Symbol类型的属性名的属性值进行读取,如:
//接4.1小节的代码,读取 console.log(obj[s]) console.log(obj1[s])
5. Object.getOwnPropertySymbols() 方法读取Symbol键名
Object.getOwnPropertySymbols() 方法可以获取所有 Symbol类型的属性名,放在一个数组中返回。也可以利用这个方法读取对应的属性值。如:
let s1 = Symbol('a') let s2 = Symbol('b') let s3 = Symbol('c') let obj = { k:'我的属性名是字符串类型', [s1]:'aaa', [s2]:'bbb', [s3]:'ccc' } console.log(Object.getOwnPropertyNames(obj)) //['k'] console.log(Object.getOwnPropertySymbols(obj)) //['Symbol(a)','Symbol(b)','Symbol(c)'] let objSymbols = Object.getOwnPropertySymbols(obj) console.log(obj[objSymbols[0]])//aaa //这样也可以读取s1的属性值
6.小结
暂时博主只整理了一些关于 Symbol 数据类型最常用的知识点,只是Symbol的一小部分内容,更详细的关于 Symbol 更详细的内容参考 《阮一峰的ECMAScript 6 入门》,后续此条笔记也会不定期进行更新。有不足的欢迎在评论区补充。