ES6 Symbol 類型

這是我參與8月更文挑戰的第7天,活動詳情查看:8月更文挑戰javascript

概述

  1. ES5 的對象屬性名都是字符串,容易形成屬性名的衝突java

  2. ES6 引入了一種新的原始數據類型 Symbol,表示獨一無二的值git

  3. Symbol 是 JavaScript 語言的第七種數據類型,前六種是:undefined、null、布爾值(Boolean)、字符串(String)、數值(Number)、對象(Object)github

    console.log(typeof Symbol());
    // symbol
    複製代碼

Symbol

  1. 使用 Symbol() 產生惟一值緩存

    // 不可以使用 new 命令
    const a = Symbol();
    const b = Symbol();
    console.log(a === b);
    // false
    複製代碼
  2. Symbol 類型不能夠添加屬性markdown

    const a = Symbol();
    a.name = 'a';
    console.log(a.name); 
    // undefined
    複製代碼
  3. Symbol 函數可添加描述,相同描述返回值並不相同函數

    const a = Symbol('a');
    console.log(a.toString());
    // Symbol(a)
    複製代碼
  4. Symbol 不能與其餘值混合運算,但能夠顯式轉換爲字符串、布爾值oop

Symbol.for

  1. 當咱們須要重複使用一個 Symbol 值,能夠使用 Symbol.for 進行全局登記post

    const a = Symbol.for("123");
    const b = Symbol.for("123");
    console.log(a === b);
    // true
    複製代碼
  2. Sybmol.keyFor 能夠返回一個已登記的 Symbol 的 Keyui

    const a = Symbol.for("123");
    console.log(Symbol.keyFor(a));
    // 123
    複製代碼

使用示例

  1. Symbol 做爲屬性名解決名稱衝突

    // 做爲屬性名時,須使用 [] 進行聲明和取值
    const name = Symbol.for("name");
    const person = {
        [name]: 'Cade'
    }
    console.log(person[name]);
    // cade
    複製代碼
  2. 緩存操做中解決名稱衝突問題

class Cache {
    static data = {};
    static set(name, value) {
        this.data[name] = value;
    }
    static get(name) {
        return this.data[name];
    }
}
let user = {
    name: 'Cade',
    key: Symbol('user')
};
let cart = {
    name: '購物車',
    key: Symbol('cart')
};
Cache.set(user.key, user);
Cache.set(cart.key, cart);
console.log(Cache.get(user.key));
複製代碼
  1. Symbol 做爲屬性名不能被遍歷獲得

    不能經過 for in、Object.keys 獲取 Symbol 類型屬性名

    let symbol = Symbol("123");
    let obj = {
      name: "Cade",
      [symbol]: "abc"
    };
    
    for (const key in obj) {
      console.log(key); 
    }
    // name
    for (const key of Object.keys(obj)) {
      console.log(key); 
    }
    // name
    複製代碼

    能夠使用 Object.getOwnPropertySymbols 獲取全部 Symbol 屬性

    for (const key of Object.getOwnPropertySymbols(obj)) {
      console.log(key);
    }
    複製代碼

    也能夠使用 Reflect.ownKeys(obj) 獲取全部屬性包括 Symbol

    for (const key of Reflect.ownKeys(obj)) {
      console.log(key);
    }
    複製代碼

內置 Symbol

  1. JavaScript 內置了許多系統 Symbol,以使用它們來微調對象的各個方面

  2. Symbol.hasInstance

    使用 a instanceof A 時,實際上執行的是 A[Symbol.hasInstance](a)

    class A {
        static [Symbol.hasInstance](val) {
            return val instanceof Array;
        }
    }
    
    console.log([1, 2, 3] instanceof A);
    // true
    複製代碼
  3. Symbol.toPrimitive

    當對象被轉爲原始類型的值時,會調用 Symbol.toPrimitive 方法,返回該對象對應的原始類型值

    Symbol.toPrimitive 被調用時,會接受一個字符串參數,表示當前運算的模式,一共有三種模式

    • Number:該場合須要轉成數值
    • String:該場合須要轉成字符串
    • Default:該場合能夠轉成數值,也能夠轉成字符串
    const obj = {
      [Symbol.toPrimitive](hint) {
        switch (hint) {
          case 'number':
            return 123;
          case 'string':
            return 'str';
          case 'default':
            return 'default';
          default:
            throw new Error();
         }
       }
    };
    console.log(2 * obj); 
    // 246
    console.log(3 + obj); 
    // '3default'
    console.log(obj == 'default'); 
    // true
    console.log(String(obj)); 
    // 'str'
    
    複製代碼
  4. 其餘內置 Symbol 參見 Well-Known Symbols

相關文章
相關標籤/搜索