1. 程式人生 > >ES6常用總結

ES6常用總結

1、語法

    1.1、命令[***]

        a、let:提供塊級作用域;不存在變數提升; 暫時性死區;不允許重複宣告。

        b、const:一旦宣告,值不可變;其他同上2-4;僅當前模組可用,跨模組需如下定義:export const A = 1。

        c、全域性變數:ES6中,var、function生命的全域性變數依舊為全域性物件的屬性;但是let、const、class是宣告的全域性變數不屬於全域性物件屬性。

    1.2、變數的解構賦值[**]

        解構型別:陣列解構[模式匹配、預設值、按次序匹配]、物件解構[按變數名取值、模式匹配]、字串、函式。

        用途:交換變數、從函式返回多個值、函式引數定義、提取Json資料、函式引數預設值等。

        一句話總結:從複雜的結構中提取想要的資料。 

    1.3、迴圈(Iterator、for...of)[**]

        Iterator:遍歷器,它是一種介面,為不同的資料結構提供統一的訪問機制。

        for...of:部署了Symbol.iterator屬性的資料結構,就可以使用for...of進行遍歷[ES6新增]。

        其中,陣列、Set、Map,可以使用entries()、keys()、values()三個方法,呼叫後返回遍歷器介面;其自身也存在遍歷器介面。

     1.4、擴充套件運算子(...)[**]

            var foo = function(a, b, c) {
                console.log(a);
                console.log(b);
                console.log(c);
            }

            var arr = [1, 2, 3];

            //傳統寫法
            foo(arr[0], arr[1], arr[2]);

            //使用擴充套件運算子
            foo(...arr);
            //1
            //2
            //3

            //陣列深拷貝
            var arr2 = arr;
            var arr3 = [...arr];
            console.log(arr===arr2); //true, 說明arr和arr2指向同一個陣列
            console.log(arr===arr3); //false, 說明arr3和arr指向不同陣列

            //把一個數組插入另一個數組字面量
            var arr4 = [...arr, 4, 5, 6];
            console.log(arr4);//[1, 2, 3, 4, 5, 6]

            //字串轉陣列
            var str = 'love';
            var arr5 = [...str];
            console.log(arr5);//[ 'l', 'o', 'v', 'e' ]

2、資料變化

    2.1、新增資料型別

        a、Symbol:

            概念:獨一無二的值。

            方法:查詢symbol:

                Symbol.for():建立新的symbol;先查詢現有symbol是否存在,如果存在則使用現有的;

                Symbol():生成新的symbol;

                Symbol.keyFor():返回已登記的symbol型別值的key。

            應用:消除魔法字元等

        b、Set資料結構[***]:相當於無重複值的陣列。[並集、交集、差集的實現簡單]

              WeakSet資料結構:成員只能是物件;其中的物件為弱引用,即垃圾回收機制不考慮。所以,其物件無法引用,weakSet本身也無法遍歷。     

        c、Map資料結構[***]:類似物件,其鍵值僅為字串[字串-值],Map結構的鍵值可以是任何型別[值-值];

            WeakMap:僅物件為鍵名;且鍵名所指物件不計入垃圾回收機制。(weap物件隨時會被回收)

        d、Proxy[物件處理方法]:對目標物件架設“攔截”層,外界的訪問需通過“攔截”層。且提供一種機制,對外界的訪問進行過濾和改寫。 

        e、Reflect[物件處理方法]:Object的優化物件。

        f、二進位制陣列:該介面的設計目的與WebGl有關,對動畫效能有提升[未深入瞭解]  

    2.2、資料型別的擴充套件

        a、字串擴充套件:主要增加了Unicode的處理方法(雙位元組字元)

        b、正則的擴充套件:主要增加了修飾符 u[檢測Unicode]和 y[相當於帶^的g]

        c、數值的擴充套件:主要提供了一些特殊值的處理方法:浮點數差的處理;Math增加了高階方法

        d、陣列的擴充套件[**]:提供了建立、填充、查詢、遍歷陣列的方法

        e、函式的擴充套件[***]:提供了引數方法、箭頭函式[固定this作用域]、尾呼叫優化策略等

        f、物件的擴充套件[***]:簡寫方法、屬性名錶達式、擴充套件運算子、屬性操作的新方法:assign()、create()、defineProperty()

3、非同步相關

    3.1、Promise [all、race、then、catch等][***]

        特點:物件的狀態不受外界影響;

                一旦狀態改變就不會再變;

        優點:可以將非同步操作,同步表達出來。

        與jquery promise的區別:

            (1)ES6 Promise是一個建構函式,jquery Promise為物件;

            (2)ES6在new Promise物件時,傳入函式,在該函式內部設定resolve、reject[狀態不受外界影響];

                    jquery Promise可以任意位置設定狀態。

            (3)ES6 Promise的非同步處理函式將進入事件迴圈的任務訊息佇列,優先順序比一般的網路、延時非同步更高,且該佇列為microtask,將在同一事件迴圈中得到處理。

    3.2、Generator[***]

        它是一個狀態機、一個遍歷器。

        通過next方法進行遍歷,每次遍歷返回一個狀態物件{value:, done:boolean};通過狀態物件done的狀態決定遍歷是否結束。且每次暫停位置由yield指令決定。亦可通過for...of進行遍歷,返回done為true的value值,而非狀態物件。

        通過Generator,可按需控制每個yield的執行時機。

    3.3、co[**]

        其實質是Generator函式的自執行模組。由於Generator自身是一種同步機制,如果存在非同步操作,其不會等待非同步執行結束,所以無法完成真正的自執行。

        而co模組,可通過結合Promise實現Generator的自執行。所以使用co模組的前提條件是,Generator函式的yield命令後面只能是Thunk函式或Promise物件。

        應用:

            控制頁面js執行流,協調ajax、圖片資源載入等非同步操作及頁面渲染的時機。

    3.4、async[ES7]

       其關鍵字: async、await, 類似co模組實現的Generator自執行機制,同步執行非同步操作。

4、Class[***]

      特點:a、類似語法糖,讓類的定義更清晰;

               b、其prototype不可列舉;

                c、繼承:extends;

                d、使用getter、setter攔截其存取行為。

5、Module模組[***]

    設計思想盡量靜態化,在編譯時載入。

    優點:不需要使用UMD模式,伺服器、瀏覽器都將支援。

    模組功能主要由:export[輸出]和import[輸入]命令構成~

    模組的繼承:export * from ‘circle'

    載入的實質:commonJS模組是值得拷貝,而ES6是值的引用。ES6為動態引用,載入時不去執行js;而commonJS載入時執行。