本篇主要是透過線上課程:HiSKIO
、w3school
及網路上搜尋資源所學習的。
ES6 概念補充
ES6 比 ES5 更提升程式品質,可以解決一些 ES5 遇到的問題,但是也會有兼容性的問題。
這邊可以使用Babel來轉換成舊的瀏覽器也可以支援的內容,babel
是一種 js 的 compiler,不過還要搭配一些工具例如Gulp
。不過我個人尚未用到,先把他紀錄下來。
這篇要補充的有四點
- 縮寫 shorthand
- 解構賦值 destructure
- 字串模板 string template
- 箭頭函式 arrow function
縮寫 Shorthand
物件縮寫
一個物件中如果 key 等於回傳的 value 就可以縮寫只寫出 key,程式會往上找到 function()中的參數。
1 2 3 4 5 6
| function makePoint(x, y) { return { x, y }; }
|
計算屬性
在宣告物件的時候,如果 key 是動態的,可以用[]中括號來刮起來,可以塞入變數、表達式等。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| function createObj(key, value) { const obj = { [key + 1]: value }; return obj; } const person = createObj("name", "Jason");
const cat = creatObj("legs", "4");
|
函式縮寫
在物件中去宣告函式的時候,可以像是呼叫函式一樣,直接把 function 省略。
1 2 3 4 5 6 7 8
| const options = { name: "Options", level: 10, created: function() {...}, mounted() {...}, beforeCreate() {...} };
|
解構賦值 Destructure
陣列解構
取出陣列中第一個或第二個數值有更快速方便的方式。
1 2 3 4 5 6 7 8 9 10 11 12 13
| const nums = [1, 2, 3];
const first = nums[0]; const second = nums[1];
const [first, second] = nums;
let first; let second; [first, second] = nums;
|
預設值
如果超出原本陣列的長度,不存在的元素會變為 undefined,如果要進行計算,可以針對超出陣列的部分設定預設值。
1 2
| const nums = [10, 20]; const [first, second, third = 30] = nums;
|
忽略元素
只想取陣列中某一個元素
1 2
| const nums = [1, 2, 3, 4]; const [, second] = nums;
|
變數交換
原本做法需要在宣告額外一個變數來暫存數值,ES6 中可以直接陣列解構變數交換。
1 2 3 4 5 6 7 8 9 10
| let a = 1; let b = 2;
let tmp = a; a = b; b = tmp;
[a, b] = [b, a];
|
剩餘部分
想要取出除了第一個以外的數值,陣列中宣告first
搭配...others
1 2 3 4 5
| const nums = [1, 2, 3, 4];
const [first, ...others] = nums; first === 1; others;
|
物件解構
與陣列解構幾乎相同,預設值,指派新名稱
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| const point = { x: 100, y: 150 };
const x = point.x;
const { x, y } = point;
const { x, y, z = 0 } = point;
const px = point.x;
const { x: px, y: py } = point;
|
解構函式參數
1 2 3 4 5 6 7 8 9 10 11 12
| function distance(point) { return Math.sprt(point.x * point.x + point.y * point.y); const { x, y } = point; return Math.sprt(x * x + y * y); }
function distance({ x, y }) { return Math.sprt(x * x + y * y); }
|
字串模板 String template
字串組合
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| function greet(name) { console.log("Hello, " + name + "!"); console.log(`Hello, ${name}!`); }
greet("Tom");
function greet(name, days) { console.log(`Hello, ${name}! It's been ${days * 24}hours.`); console.log(`Hello, ${name}! ${days < 7 ? "" : "Long time no see!"}`); } greet("Jack", 3);
|
多行字串
ES6 反引號中可以多行(換行)
1 2 3 4 5
| const words = ` dddd dddddddddd dddddddddddd `;
|
箭頭函式 Arrow function
語法簡短
ES6 的箭頭函式省略了 ES5 的 function 這個關鍵字。
傳入的參數如果只有一個可以省略小括號。
如果函式本體只有一行,而且是 return,則可以直接接在箭頭後面。
1 2 3 4 5 6 7 8 9 10 11 12 13
| var double = function(x) { return x * 2; };
const double = (x) => { return x * 2; };
const double = x => { return x * 2; };
const double = x => x * 2;
|
array.map 例子
1 2 3 4 5 6
| arr.map(function(elm, idx) { return elm + idx; });
arr.map((elm, idx) => elm + idx);
|
監聽例子
1
| btn.addEventListener("click", () => console.log("Hi"));
|
自動綁定
箭頭函式內部的 this 與外部相同,this 就是 context,函式的情境。
1 2 3 4
| const a = () => { console.log(this); }; console.log(this);
|
一般的宣告方式則是情況
1 2 3 4 5
| var b = function() { console.log(this); }; console.log(this);
|
this,作為物件的成員函式執行:this 就是該物件。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| var name = "Heisenburg"; var sayMyName = function() { console.log(this.name); };
var teacher = { name: "White" }; teacher.sayMyName = sayMyName;
sayMyName(); teacher.sayMyName();
|
button
1 2 3 4
|
btn.addEventListener("click", sayMyName);
|
如果都用箭頭函式,this就都會是window下,this.name皆為Heisenburg。