新的原始數據類型: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