新的原始数据类型:Symbol
,表示独一无二的值
其余的数据类型包括undefined
,null
,string
,number
,boolean
,object
javascript
let s = Symbol() // 注意不能使用new,由于它不是对象 typeof s // 'symbol' let s1 = Symbol('foo') s1 // Symbol(foo) // Symbol参数是一个对象,就会调用该对象的toString()方法,而后才生成一个Symbol值 const obj = { toString() { return 'abc' } } const sym = Symbol(obj) sym // Symbol(abc) let s2 = Symbol('foo') s1 === s2 // false // Symbol值不能够运算 console.log('your symbol ' + s1) // TypeError // Symbol能够显式转为字符串 String(s1) sym.toString() // 'Symbol(foo)' // Symbol能够转为布尔值,可是不能转为数值 Boolean(s) // true !s // false Number(s) // TypeError
能够防止某一个键被改写或覆盖java
使用Symbol值定义属性时,Symbol值必须放在方括号之中。code
let mySym = Symbol() let a = {} a[mySym] = 'hello' let a = { [mySym]: 'hello' } // 注意点运算符,此时mySym是字符串 a.mySym = 'hello' a[mySym] // undefined a['mySym'] // 'hello'
属性名的遍历
Symbol做为属性名,不会出如今for...in
和for...of
循环中,也不会被Object.keys()
、Object.getOwnPropertyNames()
、JSON.stringify()
返回,有一个Object.getOwnPropertySymbols
方法能够获取Symbol属性名对象
let obj = {} let foo = Symbol('foo') Object.defineProperty(obj, foo, { value: 'foobar' }) for (let i in obj) { console.log(i) // 无输出 } Object.getOwnPropertyNames(obj) // [] Object.getOwnPropertySymbols(obj) // [Symbol(foo)]
还有一个全新的APIReflect.ownKeys()
能够返回全部类型的键名,包括常规键名和Symbol键名ip
let obj = { [Symbol('my_key')]: 1, enum: 2, nonEnum: 3 } Reflect.ownKeys(obj) // ['enum','nonEnum',Symbol(my_key)]
let s1 = Symbol.for('foo') // 不会每次调用就返回一个新的Symbol类型的值 let s2 = Symbol.for('bar') // 调用30次,每次都返回同一个Symbol值,可是Symbol()会返回30个不一样的Symbol值 s1 === s2 //true // 返回一个已登记的Symbol类型值的key let s1 = Symbol.for('foo') Symbol.keyFor(s1) // 'foo' let s2 = Symbol('foo') Symbol.keyFor(s2) // undefined