Symbol是一种新的原始数据类型,ES6引入之后对象的属性名就可以有两种类型:String、Symbol,凡是属性名是属于Symbol类型的就是独一无二的,可以保证不会与其他属性名冲突。

如何创建Symbol类型的值

使用 Symbol() 函数创建,不支持new Symbol()语法,每个从Symbol()返回的值都是唯一的,作为对象属性的标志符时Symbol类型的仅有目的

  1. let s = Symbol()

可以给Symbol()函数传递一个参数用以描述创建的symbol值,且相同参数的Symbol函数返回值时是不相等的

  1. let s1 = Symbol('first')
  2. let s2 = symbol('first')
  3. s1 === s2 // false

如果传递的参数是一个对象,则会先调用该对象的 toString方法将其转为字符串,然后再生成一个Symbol值

  1. let obj = {}
  2. let s = Symbol(obj) // Symbol([object Object])

symbol类型有哪些限制

  • 不能与其他类型的值进行运算

    1. let s = Symbol()
    2. 'my first Symbol' + s // 报错
  • 可以显示转为字符串或布尔值,但是不能转为数值 ```javascript let s = Symbol()

// 显示转为字符串 String(s) // “symbol()” s.toString() // “symbol()”

// 显示转为布尔值 Boolean(s) // true !s // false

// 转为数值 Number(s) // TypeError s + 2 // TypeError

  1. <a name="nlCtu"></a>
  2. ### 作为属性名的Symbol
  3. > Symbol值作为对象属性名时不能用点运算符
  4. ```javascript
  5. let s = Symbol()
  6. // 第一种写法
  7. let obj = {}
  8. obj[s] = 'lonzo'
  9. // 第二种写法,Symbol值必须放在方括号中,若不放在方括号中,该属性名就是字符串s,而不是s代表的那个Symbol值
  10. let obj = {
  11. [s]: 'lonzo'
  12. }
  13. // 第三种写法
  14. let obj = {}
  15. Object.defineProperty(obj, s, { value: 'lonzo' })