開始嘗試 ES6
最近有時會看看 JavaScript ECMAScript 6 的相關文件,今年也是時候將新專案用 ES6 來撰寫,在還沒使用 ES6 以前,我個人比較偏好使用 CoffeeScript 或 LiveScript,如果嚐試過 CoffeeScript 後,你會發現轉換成 ES6 是相當容易。網路上可以直接看 6to5 專案,提供 Sprockets, Broccoli, Browserify, Grunt, Gulp, Webpack ..等,要嘗試 ES6 語法轉成 Javascript 可以透過 ES6 repl 介面來嘗鮮。
Classes
來看看用 CoffeeScript 怎麼寫 JavaScript Class:
class Person
constructor: (@firstName, @lastName) ->
name: ->
"#{@first_name} #{@last_name}"
setName: (name) ->
names = name.split " "
@firstName = names[0]
@lastName = names[1]
boy = new Person "Bo-Yi", "Wu"
boy.setName("Boy Apple")
console.log boy.name()
在 ES6 可以使用 classes, getters, and setters
class Person {
constructor(firstName, lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
get name() {
return this.firstName + " " + this.lastName;
}
set name(name) {
var names = name.split(" ");
this.firstName = names[0];
this.lastName = names[1];
}
}
var boy = new Person("Bo-Yi", "Wu");
boy.name = ""Boy Apple";
console.log(boy.name);
從上面可以發現 2 點不一樣的地方
- 可以忽略
function
字串
- 每個 function 後面不需要分號(;)
Interpolation
ES6 開始支援 Template String,詳細可以參考 Addy Osmani 最新寫的 Getting Literal With ES6 Template Strings
CoffeeScript:
"multi-line strings with interpolation like 1 + 1 = #{1 + 1}"
JavaScript:
"multi-line strings with interpolation like 1 + 1 = " + (1 + 1)
ES6 template strings:
`multi-line strings with interpolation like 1 + 1 = ${1 + 1}`
注意 ES6 並非用雙引號了。所以上面的 get name
function 可以改成底下
get name() {
return `${this.firstName} ${this.lastName}`;
}
Fat Arrows
在寫 Javascript 要如何把目前的 this
綁定到現在函式內,可以透過 CoffeeScript 的 =>
符號,現在 ES6 也支援了
純 JavaScript 寫法
var self = this;
$("button").on("click", function() {
// do something with self
});
CoffeeScript:
$("button").on "click", =>
# do something with this
ES6:
$("button").on("click", () => {
// do something with this
});
Default arguments
CoffeeScript 可以定義函式傳入預設值
hello = (name = "guest") ->
console.log(name)
ES6 現在也可以了
var hello = function(name = "guest") {
alert(name);
}
Splats functions
PHP 5.6 開始也支援了 Variadic functions,而 CoffeeScript 也有此功能
PHP 5.6:
<?php
function sum(...$numbers) {
$acc = 0;
foreach ($numbers as $n) {
$acc += $n;
}
return $acc;
}
echo sum(1, 2, 3, 4);
?>
CoffeeScript:
awards = (first, second, others...) ->
gold = first
silver = second
honorable_mention = others
ES6:
var awards = function(first, second, ...others) {
var gold = first;
var silver = second;
var honorableMention = others;
}
Destructuring
Destructuring 讓變數可以直接對應物件或陣列內容
CoffeeScript:
[first, _, last] = [1, 2, 3]
ES6:
var [first, , last] = [1, 2, 3];
我們可以將 set name 函式改成底下
set name(name) {
[this.firstName, this.lastName] = name.split(" ");
}
結論
更多學習資源可以直接參考 6to5 專案,從現在開始擁抱 ES6 吧。
參考: Replace CoffeeScript with ES6