ES6的Symbol數據類型的學習

新的原始數據類型Symbol,表示獨一無二的值
其餘的數據類型包括undefined,null,string,number,boolean,objectjavascript

基本知識

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...infor...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
相關文章
相關標籤/搜索