深入瞭解Symbol

一.Symbol的介紹:

Symbol 是一種特殊的、不可變的數據類型,可以作爲對象屬性的標識符使用。Symbol 對象是一個 symbol primitive data type 的隱式對象包裝器。
symbol 數據類型是一個原始數據類型。
eg:

let obj = {
  a: 1
}

等同於對象格式:

Object {
    key: value
}

在ES5的時代,對象的key只能是字符串String類型。把key改成其他數據類型?ES就指定了一個新的數據類型:Symbol。

二.使用:

1.Symbol(description) //description是可選的
eg:

//創建一個Symbol
const name = Symbol();
const name1 = Symbol('sym1');
console.log(name, name1) // Symbol() Symbol(sym1)

2.注意:Symbol不能使用new關鍵字

const name = new Symbol(); //錯誤的示範。
//Symbol is not a constructor
//使用:
const name1 = Symbol('sym1'); 
console.log(name1);// Symbol(sym1)

3.在所有使用可計算屬性名的地方,都能使用Symbol類型。比如在對象中的key。

eg:

const name = Symbol('name');
const obj = {
  [name]: "張三"
}
console.log(obj[name]) // 張三

4.使用Object.defineProperty()和Object.defineProperties()方法。這2個方法是對象的方法,但是作爲Symbol類型key,也不影響使用。

// 設置對象屬性只讀。
Object.defineProperty(obj, name, {writable: false})

三.Symbol全局共享:

Symbol有點特殊,在js文件中定義的Symbol,並不能在其他文件直接共享。

ES6提供了一個註冊機制,當你註冊Symbol之後,就能在全局共享註冊表裏面的Symbol。Symbol的註冊表和對象表很像,都是key、value結構,只不過這個value是Symbol值。
(key, Symbol)
語法:

Symbol.for() //只有一個參數

還有一個方法是獲取註冊表的Symbol。

語法:

Symbol.keyFor() //只有一個參數,返回的是key

從註冊表獲取全局共享的Symbol:

let name = Symbol.for('name');
let name1 = Symbol.for('name1');
let name2 = Symbol.for('name2');

console.log(Symbol.keyFor(name)) // name
console.log(Symbol.keyFor(name1)) // name1
console.log(Symbol.keyFor(name2)) // name2

注意:如果要防止Symbol命名重複問題,可以加上前綴。如:XXX.name

四.Symbol與類型強制轉換:

Symbol不支持這種轉換

let a = Symbol('a');
console.log(typeof a);
console.log(a + ' haha') // Cannot convert a Symbol value to a string

五.Symbol檢索:

在對象中獲取字符串的key時,可以使用Object.keys()或Object.getOwnPropertyNames()方法獲取key,但是使用Symbol做key是,你就只能使用ES6新增的方法來獲取了。
eg:

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

let obj = {
  [a]: "123",
  [b]: 45
}

const symbolsKey = Object.getOwnPropertySymbols(obj);

for(let value of symbolsKey) {
  console.log(obj[value]) 
}
//"123"
//45
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章