聊聊 ES6 中新增的 Symbol 類型

《深入理解ES6》閱讀隨筆

創建

在 ES5 及之前,對象的屬性名都是通過字符串來表示的。Symbol 是 ES6 新增的第六種基本類型,也可以作爲對象的聲明屬性名;

let cat = Symbol();
let animal = {};
animal[cat] = "Tom";
console.log(animal[cat]);   // 輸出 Tom

Symbol 默認接收一個可選參數,用於描述用途:

let cat = Symbol("cat");

用途

Symbol 創建的變量具有唯一性:

// ES5
let dog1 = "dog"
let dog2 = "dog"
console.log(dog1 === dog2); // 輸出 true
// ES6
let cat1 = Symbol("cat");
let cat2 = Symbol("cat");
console.log(cat1 === cat2); // 輸出 false

共享體系

在全局環境下定義的 Symbol 可能會出現訪問錯亂的問題,此時需要使用 Symbol.for 的方式來聲明變量:

let cat1 = Symbol.for("cat");
let cat2 = Symbol.for("cat");
console.log(cat1); // 輸出 Symbol(cat)
console.log(cat1); // 輸出 Symbol(cat)

如果聲明已存在,則直接取值,否則創建;

強制類型轉換

在使用 console.log 輸出 Symbol 時,會默認調用 toString 轉換爲字符串結果輸出;但並未對其進行強制轉換,依舊是 Symbol 類型:

let cat = Symbol("cat");
console.log(cat); // 輸出 Symbol(cat)
console.log("name:"+cat) // error

Symbol 與其他五類基礎類型均不可能相互轉換;

檢索

可以通過 Object.getOwnPropertySymbols 方法來枚舉 Symbol 類型的屬性:

let cat = Symbol.for("cat");
let animal = {
  [cat]: "cat",
};
animal["dog"] = "dog";
console.log(Object.getOwnPropertySymbols(animal)); // 輸出 [ Symbol(cat) ]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章