1. 程式人生 > >ECMAScript6 學習(一)[let \const\set\map\rest(...)]

ECMAScript6 學習(一)[let \const\set\map\rest(...)]

一、簡介    

ECMAScript 6 的目標,是使得 JavaScript 可以用來編寫複雜的應用程式、函式庫和程式碼的自動生成器(code generator)。

最新的瀏覽器已經大部分支援 ECMAScript 6 的語法,可以通過《ECMAScript 6 瀏覽器兼容表》檢視瀏覽器支援情況。

下面對 ECMAScript 6 新增的語法特性逐一介紹。如果要看最新版本可以看 ECMAScript 6 入門

二、資料型別

2.1 let 命令

(1)概述

ECMASCript6 新增了let命令,用來宣告變數。它的用法類似於var,但是所宣告的變數,只在let命令所在的程式碼塊內有效。

上面程式碼在程式碼塊之中,分別用let和var 聲明瞭兩個變數。然後在程式碼塊之外呼叫這兩個變數,結果let宣告的變數報錯,var 宣告的變數返回了正確的值。這表明了let宣告的變數只在它所屬的程式碼塊內有效。

下面的程式碼如果使用var,最後輸出的是9.  如果使用 let 宣告的變數僅在塊級作用域有效,最後輸出的是6.

注意,let 不允許在相同作用域內,重複宣告同一個變數。


(2)塊級作用域
let實際上為JavaScript新增了塊級作用域。

上面的函式有兩個程式碼塊,都聲明瞭變數n,執行後輸出5.這表示外層程式碼塊不受內層程式碼塊的影響。如果使用var 定義變數n,最後輸出的值就是10. 

(3)不存在變數提升

需要注意的是,let宣告的變數不存在"變數提升"現象。


上面程式碼let執行後會報錯,表示Z沒有定義。如果用var宣告H,就不會報錯,輸出結果為undefined.
2.2 const命令
     const 也用來宣告變數,但是宣告的是常量。一旦宣告,常量的值就不能改變。

2.3 Set 資料結構

    ES6提供了新的資料結構。它類似於陣列,但是成員的值都是唯一的,沒有重複的值。

   Set 本身是一個建構函式,用來生成Set結構。

  var s = new Set();

  [2,3,,5,4,5,22,2,4].map(x=>s.add(x)) 

  for(i of s){console.log(i);

 上面程式碼表示,set資料結構不會新增重複的值。

        set 資料結構有以下屬性和方法:

        ●size:返回成員總數。

        add(value):新增某個值

        delete(value):刪除某個值

        has(value):返回一個布林值,表示該值是否為set的成員。

        clear():清除所有成員。

     

           2.4 Map 資料結構

          ES6還提供了map 資料結構。它類似於物件,就是一個鍵值對的集合,但是"鍵"的範圍不限於字串,甚至物件也可以當作鍵。

        var m = new Map();
       o = {p:"Hello world"};
       m.set(o,"content");
       console.log(m.get(o));

      上面的程式碼將一個物件當作m 的一個鍵。

  Map資料結構有以下屬性和方法。

    size:返回成員總數,

    set(key,value):設定一個鍵值對

    get(key):讀取一個鍵

    has(key):返回一個布林值,表示某個鍵是否在Map資料結構中。

    delete(key):刪除某個鍵。

    clear():清除所有成員。

 2.5 rest(...) 運算子

(1) 基本用法

  ES6   引入rest 運算子(...),用於獲取函式的多餘引數,這樣就不需要使用arguments.length了。rest運算子後面是一個數組變數,該變數將多餘的引數放入陣列中。


       上面程式碼的add 函式是一個求和函式,利用rest運算子,可以向該函式傳入任意數目的引數。

       下面是一個利用rest運算子改寫陣列push方法的例子。

       

(2) 將陣列轉為引數序列

rest 運算子不僅可以用於函式定義,還可以用於函式呼叫。


    從上面的例子可以看出,rest運算子的另一個重要作用是,可以將陣列轉變成正常的引數序列。利用這一點,可以簡化求出一個數組最大元素的寫法。

 

上面程式碼表示,由於Javascript不提供求陣列最大元素的函式,所以只能套用Math.max函式,將陣列轉為一個引數序列,然後求最大值。有了rest(...)運算子以後,就可以直接用Math.max了。