ES6

ECMAScript 6 (ES6): ECMAScript第6版,2015年發布

重點新語法如下:

變數宣告 let, const (block scope)

  • const常數,不能變動其記憶體位置
  • 指向的內容是可以變動的
  • let在宣告前不能使用
  • let,const 作用域在{}中

Template Literals

  • 可將變數放入 ${}

  • // ES5寫法
    var name = 'Your name is ' + first + ' ' + last + '.'
    var url = 'http://localhost:3000/api/messages/' + id
      
    // ES6寫法
    var name = `Your name is ${first} ${last}.`
    var url = `http://localhost:3000/api/messages/${id}`
    

Destructuring assignment 解構賦值

  • value assignment

  • array的第幾個值assign給變數

  • object對應的key值assign給變數

  • // Array
    const [a,b]=[1,2] // a=1, b=2
    const [a, ,b]=[1,2,3] // a=1, b=3
    const [a,...b]=[1,2,3] // a=1, b=[2,3]
      
    const str="hello"
    const [a,b,c,d,e]=str 
    
  • // Object
    let obj={
        website:"pengpon.github.io",
        country:"Taiwan"
    }
    let {website,country}=obj;
      
    // 完整寫法
    let {website:websiteValue,country:countryValue}=obj;
    // 根據屬性名稱來給變數值
    // 值是給冒號後的變數
    
  • 陣列的解構賦值要注意順序

  • 物件的解構賦值要注意key值,常用來處理JSON data

  • 可以給預設值

  • const [missing = true] = []
     console.log(missing)
     // true
      
     const { message: msg = 'Something went wrong' } = {}
     console.log(msg)
     // Something went wrong
      
     const { x = 3 } = {}
     console.log(x)
     // 3
    
  • // 
    const { a ='hello' } = 'hello'
    const [ b ='hello' ] = 'hello'
      
    console.log( a, b)
    // 結果會是a=hello, b=h
      
    // 宣告a變數 預設值為字串 hello
    // {a}='hello' 尋找有無a這個屬性
    // 'hello'並無a這個屬性 所以a的值為一開始的預設值"hello"
      
    //宣告b變數 預設值為字串 hello
    // [b]='hello'
    // b的值為字串的第一個字元 'h'
      
      
    

Default Parameters 參數預設值

  • 幫函式的參數加上預設值

  • 可防止exception出現

  • // ES5
    var link = function (height, color, url) {
        var height = height || 50
        var color = color || 'red'
        var url = url || 'http://azat.co'
        ...
    }
          
    // ES6
    var link = function(height = 50, color = 'red', url = 'http://azat.co') {
      ...
    }
    

Multi-line String 多行字串

  • 透過`,輸入多行字串

Object Literals

  • ES6提供新的語法 讓物件更簡潔

  • 物件屬性初始化

     // ES5
     function getProfile(name, age, gender) {
            return {
                name: name,
                age: age,
                gender: gender
            }
         // 變數名稱和屬性名稱一樣 
        }
      
      console.log(getProfile("peng", "18", "F"));
    // {name: "peng", age: "18", gender: "F"}
    
    // ES6
    function getProfile(name, age, gender) {
            return {
                name,
                age,
                gender
            }
        // 若屬性名稱和賦值的變數名一樣, ES6提供簡寫
        }
      
      console.log(getProfile("peng", "18", "F"));
    // {name: "peng", age: "18", gender: "F"}
    
  • 物件函式簡寫

     //ES5
        function getHello(name) {
            return {
               sayHello : function() {
                    return `Hi, I am ${name}`;
                }
            }
        }
      
       console.log(getHello("peng").sayHello()); 
    //"Hi, I am peng"
    
    //ES6
    // 省略function關鍵字和冒號
     function getHello(name) {
            return {
               sayHello() {
                    return `Hi, I am ${name}`;
                }
            }
        }
      
       console.log(getHello("peng").sayHello());
    
  • 屬性名稱可運算

        var type= "type";
        var i = 0;
        const book = {
            [type + ++i]: "html",
            [type + ++i]: "css",
            [type + ++i]: "javascript"
        }
      
        console.log(book);
    //{
    //	type1:"html",
    //  type2:"css",
    //  type3:"javascript"
    //}
         
    

Arrow Function 箭頭函式

  • // 簡單比較
    // with arrow function
    hello = () =>{
        return "hello world!"
    }
      
    //before
    hello = function(){
        return "hello world!"
    }
      
    //如果function只有一行statement,而statement是要return一個值
    //可以省略{}和return不寫
    hello = () => "hello world";
      
    
  • 在一般的function中, this通常為呼叫函式所代表的物件, 誰呼叫了function, this就指向誰

    function A() {
    console.log(this)
    }
    A();//Window
      
    // function A在全域環境中執行 
    // 全域物件window呼叫此函式
    // this指向window
    
    var b = {
    getThis:function(){
    console.log(this)
    }
    }
    b.getThis()//b
    
  • 在arrow funtion中的this代表arrow function所在的物件

  • 有關this,call,apply bind 期待會記得..再寫一篇

Promises

The Promise object represents the eventual completion (or failure) of an asynchronous operation, and its resulting value.

待續…..新的筆記


Classes

Use the keyword class to create a class, and always add a constructor method.

The constructor method is called each time the class object is initialized.


Modules

import & export


Spread Operator

…表示,將陣列展開成個別數值or合併

let fruit=['apple','banana','orange'];
console.log(...fruit)
// apple banana orange

Rest Operator

…表示,將剩餘的值轉為陣列

const [a,...b]=[1,2,3,4,5,6]
// b=[2,3,4,5,6]

延伸閱讀

Top 10 ES6 Features Every Busy JavaScript Developer Must Know

你不可不知的 JavaScript 二三事#Day23:ES6 物件實字威力加強版 (Enhanced Object Literals)

淺談 JavaScript 頭號難題 this