生成唯一標識
- 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