初識Symbol數據類型

Symbol做爲JavaScript ES6新的原始數據類型,表示獨一無二的值。

它有如下幾個特性javascript

沒法用new進行顯式定義

let a = Symbol()
let b = new Symbol() // 報錯複製代碼

typeOf返回的值爲Symbol

var sym = Symbol('foo')
typeof sym    // 'symbol'複製代碼

symbol屬性是不可枚舉的

symbol不會在for循環、for(...in...)中出現,由於這個屬性是匿名的java

let temp = {
    [Symbol('people')]: 'symbol類型',
    id: 123,
    des: '定義類型'
}

for (let prop in temp ) {   
    console.log(prop)   // 分別會輸出:'id''des'
}複製代碼

Object.getOwnPropertySymbols()該方法能夠返回一個包含全部Symbol自有屬性的數組:

let temp = {    
    [Symbol('people')]: 'symbol類型',    
    id: 123,    
    des: '定義類型'
}
Object.getOwnPropertySymbols(temp) // [Symbol(people)]複製代碼

Object.keys()Object.getOwnPropertyNames()方法能夠檢索對象中全部的屬性名,前一個方法返回全部的可枚舉屬性名.後一個方法不考慮屬性的可枚舉性一概返回,但都不能返回symbol屬性數組

Object.keys(temp )   // ['id', 'des']
Object.getOwnPropertyNames(obj)   // ['id', 'des']複製代碼

定義兩個相同的Symbol數據是不相等的

若是要建立就一個共享的Symbol須要用到Symbol.for()方法. Symbol.for()方法首先在全局Symbol註冊表中搜索鍵爲‘uid’的Symbol是否存在,若是存在,直接返回已有的Symbol;不然,建立一個新的Symbol,並使用這個鍵在Symbol全局註冊表中註冊,隨機返回新建立的Symbol。
bash

let a = Symbol('AAA')
let b = Symbol('AAA')    
console.log(a === b) // false
    
let c = Symbol.for('uid')
let d = Symbol.for('uid')
    
console.log(c === d) // true複製代碼

使用JSON.stringify()時,以symbol值做爲鍵的屬性會被忽略

JSON.stringify({[Symbol('foo')]: 'foo'});                 
// '{}'複製代碼
相關文章
相關標籤/搜索