Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

js 中的 symbol 是什么? #27

Open
yangrenmu opened this issue Jul 22, 2020 · 0 comments
Open

js 中的 symbol 是什么? #27

yangrenmu opened this issue Jul 22, 2020 · 0 comments

Comments

@yangrenmu
Copy link
Owner

前言不搭后语

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

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() 方法

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant