前言不搭后语
雨打梨花深闭门,忘了青春,误了青春。
赏心乐事共谁论?花下销魂,月下销魂。
愁聚眉峰尽日颦,千点啼痕,万点啼痕。
晓看天色暮看云,行也思君,坐也思君。
symbol 是什么
symbol
是es6
中引入的一种基本数据类型。symbol
类型的值是通过Symbol()
函数来生成的,但是它不是构造函数,不能使用new
。symbol
类型的值是独一无二的。
symbol 语法
可以像下面这样生成一个symbol类型的值。
const s = Symbol(description)
-
参数
description
:
可选,是一个字符串类型。如果传入的description
是一个对象,则会调用toString
方法将对象转为字符串,然后再生成symbol
类型的值。description
的主要作用是区分symbol
。
由于symbol
类型的值是唯一的,所以即使传入相同的description
生成的、Symbol()
函数返回值也是不通过的。
Symbol('sys') === Symbol('sys') // false
-
运算
symbol
类型的值,不能与其他基本类型的值进行运算,但是symbol
可以显示的转为字符串。
// 不能与基本类型进行运算
const sys = Symbol('sys')
sys + 1 // Uncaught TypeError: Cannot convert a Symbol value to a number
// 显式的转为字符串
sys.toString() // Symbol(sys)
// 转为布尔型
!sys // false
-
Sysmbol.prototype.description
可以返回symbol
的描述。
const sys = Symbol('awai')
sys.description // awai
作为属性名使用
由于symbol
值唯一,所以当对象需要唯一的属性名时,可以使用 symbol
类型的值。
-
不能使用点运算符
使用 symbol
值作为属性名时,不能使用点运算符,必须放在方括号之中。
const sys = Symbol('awai')
const aha = {
[sys]: 'awai'
}
console.log(aha[sys]) // awai
console.log(aha.sys) // undefined,因为点运算符后面被当成字符串,而不是symbol值
-
不能被遍历
需要注意的是,symbol
类型的属性名,是不能被遍历的(for in、for of 遍历不到 symbol)
。
const aha = {
[sys]: 'awai',
you: 'you'
}
for (let i in aha) {
console.log(aha[i]) // you,symbol 类型的属性,没有被遍历
}
-
JSON.stringify()
JSON.stringify()
会忽略掉 symbol
值的属性。
const aha = {
[sys]: 'awai',
you: 'you'
}
console.log(JSON.stringify(aha)) // {"you":"you"}