在前一篇我們介紹了:
let、const、箭頭函式、模板字面值(Template Literal)、模組化(import / export)。
今天要接著看的是 ES6 其他的特性
能讓我們在操作陣列、物件、參數時寫出更簡潔、更語意化的程式碼。
const [a, b] = [10, 20];
console.log(a, b); // 10 20
const person = { name: "Kenneth", age: 30 };
const { name, age } = person;
console.log(name, age); // Kenneth 30
也可以設定預設值或改變變數名稱:
const user = { name: "Jean" };
const { name, age = 18 } = user;
console.log(name, age); // Jean 18
const { name: userName } = user;
console.log(userName); // Jean
甚至可以在函式參數中直接使用解構:
function greet({ name, age }) {
console.log(`Hi, I’m ${name}, ${age} years old.`);
}
const person = { name: "Kenneth", age: 30 };
greet(person);
這兩個語法看起來一樣 (...),但用途完全相反:
Spread 是「展開」,Rest 是「收集」。
const arr1 = [1, 2];
const arr2 = [...arr1, 3, 4];
console.log(arr2); // [1, 2, 3, 4]
const obj1 = { a: 1, b: 2 };
const obj2 = { ...obj1, c: 3 };
console.log(obj2); // { a:1, b:2, c:3 }
const numbers = [3, 5, 9];
console.log(Math.max(...numbers)); // 9
function sum(...nums) {
return nums.reduce((a, b) => a + b, 0);
}
console.log(sum(1, 2, 3, 4)); // 10
ES6 也讓物件的撰寫更簡潔、更動態。
可以不用重複寫 key: value,
也能在建立物件時用變數當屬性名稱。
const name = "Kenneth";
const age = 30;
// 傳統寫法
const user1 = { name: name, age: age };
// ES6 簡寫
const user2 = { name, age };
console.log(user2); // { name: 'Kenneth', age: 30 }
計算屬性名稱(Computed Property Names)
const key = "score";
const student = { [key]: 90 };
console.log(student); // { score: 90 }
方法簡寫(Method shorthand)
const player = {
name: "Jean",
sayHi() {
console.log(`Hi, I’m ${this.name}`);
}
};
player.sayHi(); // Hi, I’m Jean
在 ES5 中,若函式沒給參數,通常要自己檢查:
function greet(name) {
name = name || "Guest";
console.log(`Hello, ${name}!`);
}
ES6 可以直接在參數位置設定預設值:
function greet(name = "Guest") {
console.log(`Hello, ${name}!`);
}
greet(); // Hello, Guest!
greet("Lena"); // Hello, Lena!
for...of 是 ES6 新的迴圈寫法,
可以直接遍歷「可迭代物件」(array、string、Set、Map)。
const arr = [10, 20, 30];
for (let value of arr) {
console.log(value);
}
// 10
// 20
// 30