symbol是一种基本数据类型。Symbol()函数会返回symbol类型的值,改类型具有静态属性和静态方法。
它不是对象,我们可以把它理解为不能重复的字符串。

1、不能new

  1. let s1 = Symbol()
  2. let s2 = Symbol()
  3. console.log(s1) // Symbol()
  4. console.log(s2) // Symbol()
  5. console.log(s2 === s1) // false

Symbol是独一无二的,两个Symbol看起来一样,实则不相等。

2、传参和描述

对于上面的s1、s2的声明,我们不知道它们代表了什么。可以传一个字符串,作为Symbol的描述

  1. let s1 = Symbol('foo')
  2. let s2 = Symbol('bar')

如果传入一个对象,则会自动调用对象的toString()方法

  1. const obj = {
  2. name: 'zx'
  3. }
  4. let s = Symbol(obj)
  5. console.log(s)

image.png

  1. const obj = {
  2. name: 'zx',
  3. toString: function() {
  4. return this.name
  5. }
  6. }
  7. let s = Symbol(obj)
  8. console.log(s)

image.png
我们可以通过s.description拿到描述
image.png

3、另一种声明方式

Symbol.for

还可以使用Symbol.for来声明,用Symbol.for声明的两个相同描述的变量是相等的。Symbol.for是在全局定义的。
会在全局作用域找那个描述。

  1. let s1 = Symbol.for('foo')
  2. let s2 = Symbol.for('foo')
  3. console.log('s1 === s2 ', s1 === s2)
  4. let s3 = Symbol('foo')
  5. let s4 = Symbol('foo')
  6. console.log('s3 === s4 ', s3 === s4)

image.png

Symbol.keyFor

image.png
Symbol.keyFor传入一个Symbol,然后获取他的描述符,注意:只对用Symbol.for声明的变量有效。

4、对象属性为Symbol遍历

使用 Object.keys 和 Object.getOwnPropertyNames 只能遍历非Symbol属性,而Object.getOwnPropertySymbols只能拿到Symbol属性。
两者都遍历的拿到的话得使用Reflect.ownKeys