ES 之 Symbol

生成唯一標識
  • Symbol類型的key是不能通過Object.keys()或者for...in來枚舉的,它未被包含在對象自身的屬性名集合(property names)之中。
  • 所以,利用該特性,我們可以把一些不需要對外操作和訪問的屬性使用Symbol來定義
  • 也正因爲這樣一個特性,當使用JSON.stringify()將對象轉換成JSON字符串的時候,Symbol屬性也會被排除在輸出內容之外
const peter=Symbol()
const tom=Symbol()


const classRoom={
    [Symbol('Lily')]:{grade:60,gender:2},
    Tom:{grade:60,gender:1},
    [Symbol('Lily')]:{grade:90,gender:2},
}
console.log("keys:",Object.keys(classRoom)) //只有tom
for (const c in classRoom){
    console.log(c)
}
const syms=Object.getOwnPropertySymbols(classRoom) //除了沒tom的

console.log(syms)
獲取Symbol的屬性
// 使用Object的API
Object.getOwnPropertySymbols(obj) // [Symbol(name)]

// 使用新增的反射API
Reflect.ownKeys(obj) // [Symbol(name), 'age', 'title']
使用Symbol來替代常量保證唯一
註冊和獲取全局Symbol

通常情況下,我們在一個瀏覽器窗口中(window),使用Symbol()函數來定義和Symbol實例就足夠了
但是,如果你的應用涉及到多個window(最典型的就是頁面中使用了),並需要這些window中使用的某些Symbol是同一個,那就不能使用Symbol()函數了,因爲用它在不同window中創建的Symbol實例總是唯一的,而我們需要的是在所有這些window環境下保持一個共享的Symbol。
這種情況下,我們就需要使用另一個API來創建或獲取Symbol,那就是Symbol.for(),它可以註冊或獲取一個window間全局的Symbol實例

let gs1 = Symbol.for('global_symbol_1')  //註冊一個全局Symbol
let gs2 = Symbol.for('global_symbol_1')  //獲取全局Symbol

gs1 === gs2  // true
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章