js 中的 symbol 是什么?

200 阅读2分钟

前言不搭后语

雨打梨花深闭门,忘了青春,误了青春。
赏心乐事共谁论?花下销魂,月下销魂。
愁聚眉峰尽日颦,千点啼痕,万点啼痕。
晓看天色暮看云,行也思君,坐也思君。

symbol 是什么

symboles6 中引入的一种基本数据类型。symbol类型的值是通过Symbol()函数来生成的,但是它不是构造函数,不能使用newsymbol类型的值是独一无二的。

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

参考文章

ECMAScript 6 入门-阮一峰
简单了解ES6/ES2015 Symbol() 方法