Symbol 使用場景


一. 簡介

ES6 引入了一種新的原始數據類型Symbol,表示獨一無二的值。它是 JavaScript 語言的第七種數據類型,前六種是:undefinednull、布爾值(Boolean)、字符串(String)、數值(Number)、對象(Object)。

Symbol 值通過Symbol函數生成。這就是說,對象的屬性名現在可以有兩種類型,一種是原來就有的字符串,另一種就是新增的 Symbol 類型。凡是屬性名屬於 Symbol 類型,就都是獨一無二的,可以保證不會與其他屬性名產生沖突。

注意,Symbol函數前不能使用new命令,否則會報錯。這是因為生成的 Symbol 是一個原始類型的值,不是對象。也就是說,由於 Symbol 值不是對象,所以不能添加屬性。基本上,它是一種類似於字符串的數據類型。

二.使用場景

{
    let a1=Symbol.for('abc')
    let obj={
        [a1]:'123',//參考api中對象的擴展部分中屬性名表達式,這里[a1]代表變量a1的key
        'abc':'123',
        'c':456
    }
    console.log('obj',obj)
}

//結果 {abc: "123", c: 456, Symbol(abc): "123"}

可以看到兩個abc是不沖突的

Symbol.for與Symbol() 的區別

let a = Symbol.for('abc')
let b = Symbol.for('abc')

console.log(a === b)

// 結果 true

let a = Symbol('abc')
let b = Symbol('abc')

console.log(a === b)

// 結果 false

//Symbol() 每次都會返回不同的類型值

  

注意:常規的for in,let of的方式去取 ,比如Object.entries,Object.keys,是拿不到symbol的值

for(let [key,value] of Object.entries(obj)){
        console.log('let of',key,value)
}

//結果 let of abc 123  let of c 456

  

解決方案

1)使用Object.getOwnPropertySymbols(obj) 。這種方式只拿到了symbol的變量的值

Object.getOwnPropertySymbols(obj).forEach(function(item){
        console.log(obj[item])
})

// 結果 123

2)使用Reflect.ownKeys(obj)

Reflect.ownKeys(obj).forEach(function(item){
    console.log(obj[item])
})

// 結果 123  456   123

 

具體使用請參考:API

轉載自 https://www.cnblogs.com/knyel/p/7844178.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM