2016年12月22日 星期四

[ES6] Javascript 開發者必須知道的 10 個新功能

1- Default Parameters

當傳入 function 的參數沒有給值時,防止 expection 出現的方法是設定預設值,es6 比起 es5 的使用方法更快:
var link = function(height = 50, color = ‘red’, url = ‘http://azat.co') { … }

2- Template Literals

在字串 (string) 內嵌入變數時,ES5 必須把字串拆散,把變數通過 + 操作加入字串; ES6 容許通過語法 ${val} 嵌入到字串中:
// es5
// var name = ‘Your name is ‘ + first + ‘ ‘ + last + ‘.’
var name = `Your name is ${first} ${last}.`
 

3- Multi-line Strings

ES6 可以通過 backticks (鍵盤左上角,數字1旁邊)代替 ‘ ,進行多行的字串輸入:
// es5
// var name = ‘first line’
// + ‘second line’
var name = `first line
second line`

4- Destructuring Assignment

ES6中,通過簡單的 value assignment, 把 array 內的第 n 值assign 到變數, 或 object 內對應的 key的值 assign 到變數:
//object[a, b, …rest] = [1, 2, 3, 4, 5];
console.log(a); // 1
console.log(b); // 2
console.log(rest); // [3, 4, 5]
//object
var o = {p: 42, q: true};
var {p, q} = o;
console.log(p); // 42
console.log(q); // true

5- Object Literals

ES6 的 Object 定義變得清楚而且簡短,通過提供縮寫語法:function 定義和初始化參數。也提供 property keys 的初始值運算(computed property keys):
function getCar(make, model, value) {
 return {
   // with property value shorthand
  // syntax, you can omit the property
  // value if key matches variable
  // name
  make, // same as make: make
  model, // same as
  model: model
  value, // same as value: value
  // computed values now work with
  // object literals
  [‘make’ + make]: true,
  // Method definition shorthand syntax
  // omits `function` keyword & colon
  depreciate() {
    this.value -= 2500;
  }
 };
}
let car = getCar(‘Kia’, ‘Sorento’, 40000);

6- Arrow Functions

Arrow function expression,也是所謂的 fat arrow function,最初流行在 coffeescript 的語法中,現在可以在 Javascript 上使用。它最令人興𡚒的是對 this 的行為修正,this 只會對當前function 的內容有效 mozilla.org
(param1, param2, …, paramN) => { statements }
(param1, param2, …, paramN) => expression
// 等於 : => { return expression; }
// 只有一個參數時,括號才能不加:
(singleParam) => { statements }
singleParam => { statements }
//若無參數,就一定要加括號:
() => { statements }

7- Promises

Promises 的使用一直在 Javascript 上有大量的爭議性,市面上有大量的代替品例如 async, generators, callbacks etc. 它們處理的問題都一樣,非同步 function。單是Promises就很有很多套成熟的代替品: q, bluebird, deferred.js, vow, avow, jquery deferred etc。
ES6對各第三方 Library 的不同Promises 用方製訂了一套標準,而且結合 arrow function 的使用提高它的可讀性和簡短性。即使後來ES7的明日之星 Async/Await處理和 Promise相同的問題,Promise 并沒有因些被搶生意,因為 Async/Await 都是通過 Promise 創建的 Object:
var wait1000 = () => new Promise((resolve, reject) => {
    setTimeout(resolve, 1000)
})
wait1000()
    .then(function() {
        console.log(‘Yay!’)
        return wait1000()
    })
    .then(function() {
        console.log(‘Wheeyee!’)
    });

8- Let & Const, Block-Scoped

— Let 只會在目前的 { }內有效,而且重覆定義時會 throw Error 提示 ;
— Const 只會在目前的 { }內有效,定義時必須 initialize,而且不能更改 :
function letExample(value) {
 if (value) {
 let letValue = value;
 console.log(‘inside block’, letValue);
 // [SyntaxError] redeclaration of letValue would be a SyntaxError
let letValue = ‘foo’;
 }
 try {
 // [SyntaxError] Accessing letValue is a Reference Error because it 
 // was defined w/in if-block
console.log(letValue);
 // if we get here, it means that the JS engine didn’t 
 // throw an exception, which means that the engine 
 // (or transpiled code) did not faithfully reproduce 
 // how let should work
console.log(‘let not faithfully handled’);
 } catch (e) {
 // e is a ReferenceError 
 console.log(‘letValue not accessible’, e);
 }
}
letExample(2);

9- Classes

如果你是 oop 的忠實粉絲你一定會喜歡ES6為 oop 用戶設推出的 classes feature ,運用 prototype 和 function 實用出類似具有 inheritance 結構的的類別(和傳統 java, python 的類別有差別):
  • 定義和實體化 Classes
  • 通過 extends 創建 subclasses
  • 通過 super 呼叫 parent Object
  • 四個重要 methods
  • Constructors
  • Static methods
  • Prototype methods
  • Symbol methods (unique & private)
class Cat {
    constructor(name) {
        this.name = name;
    }
    speak() {
        console.log(this.name + ‘makes a noise.’);
    }
}
class Lion extends Cat {
    speak() {
        super.speak();
        console.log(this.name + ‘roars.’);
    }
}

10- Module

在AMD, RequireJS, CommonJS 和其他JS framework 的演變下,具 import 和 export 的module 功能終於在ES6出生了:

Export

export var port = 3000
export function getAccounts(url) {
}

Import

import {port, getAccounts} from ‘module’
console.log(port) // 3000

沒有留言:

張貼留言

Google Analytics初學者入門簡介