Symbol是一种新的原始数据类型,ES6引入之后对象的属性名就可以有两种类型:String、Symbol,凡是属性名是属于Symbol类型的就是独一无二的,可以保证不会与其他属性名冲突。
如何创建Symbol类型的值
使用 Symbol()
函数创建,不支持new Symbol()语法
,每个从Symbol()返回的值都是唯一的,作为对象属性的标志符时Symbol类型的仅有目的
let s = Symbol()
可以给Symbol()函数传递一个参数用以描述创建的symbol值,且相同参数的Symbol函数返回值时是不相等的
let s1 = Symbol('first')
let s2 = symbol('first')
s1 === s2 // false
如果传递的参数是一个对象,则会先调用该对象的 toString方法将其转为字符串,然后再生成一个Symbol值
let obj = {}
let s = Symbol(obj) // Symbol([object Object])
symbol类型有哪些限制
不能与其他类型的值进行运算
let s = Symbol()
'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
<a name="nlCtu"></a>
### 作为属性名的Symbol
> Symbol值作为对象属性名时不能用点运算符
```javascript
let s = Symbol()
// 第一种写法
let obj = {}
obj[s] = 'lonzo'
// 第二种写法,Symbol值必须放在方括号中,若不放在方括号中,该属性名就是字符串s,而不是s代表的那个Symbol值
let obj = {
[s]: 'lonzo'
}
// 第三种写法
let obj = {}
Object.defineProperty(obj, s, { value: 'lonzo' })