Skip to content

Latest commit

 

History

History
293 lines (239 loc) · 5.87 KB

13.md

File metadata and controls

293 lines (239 loc) · 5.87 KB

Javascript ECMA 整理

Arrow function

Arrow function 可以讓 function 更為簡潔,並且在 arrorw function 內的 scoop 都共享同一個 this 這就不用讓 function 一開始就 bind this。

function foo(a, b) {
    return a + b;
}

const foo = (a, b) => {
    return a + b;
}

Function default value

ES6 支援在定義函數時就宣告預設值

function foo(height = 50, color = 'red') 

也可以不使用函數預設值

function foo(height, color) {
    let height = height || 50;
    let color = color || 'red;
} 

這樣寫一般沒問題,但當參數的布爾值為false時,就會有問題了。比如,我們這樣調用foo函數

foo(0, '')   

因為0的布爾值為false,這樣height的取值將是50。同理color的取值為『red』。所以說,函數參數默認值不僅能是代碼變得更加簡潔而且能規避一些問題。


String template

ES6 支援使用 string template,使得字符串的拼接更加的簡潔、直觀。

不使用 string template

const str = 'My name is' + name + '.';

使用 string template

const str = `My name is ${name}.`

Destructuring assignment

解構賦值語法是JavaScript的一種表達式,可以方便的從數組或者對象中快速提取值賦給定義的變量。

const foo = ["one", "two", "three", "four"];
const [one, two, three] = foo; 
console.log(one); // "one" 
console.log(two); // "two" 
console.log(three); // "three" 
// 如果要忽略某些值,可以按照下面的寫法獲取
const [first, , ,last] = foo;
console.log(first); // "one" 
console.log(last); // "four" 
// 也可以這樣寫 
const a, b; 
[a, b] = [1, 2]; 
console.log(a); // 1 
console.log(b); // 2

// 也可以給他預設值
const a, b; [a = 5, b = 7] = [1]; 
console.log(a); // 1 
console.log(b); // 7

// 通過解構賦值可以方便的交換兩個變量的值。
let a = 1; let b = 3;
[a, b] = [b, a]; 
console.log(a); // 3 
console.log(b); // 1

// 也可以拿出 object 裡面的值
const struct = {
    height: 50,
    color: 'red'
};
const {height, color} = struct;

Spread operator and rest

函數調用

foo(...iterableObj)

object 或者是 string

[...iterableObj, '4', ...'hello', 6]

Clone object

const cloneObj = {...obj};

Clone array

const arr = [1, 2, 3]; 
const arr2 = [...arr]; // 等同於 arr.slice()

值得注意的是透過 spread operator clone 跟 Object.assign 一樣 都屬於 shallow clone,表示只拷貝第一層的 property

restParam(1, 2, 3, 4, 5); 
const restParam = (p1, p2, ...p3) => { 
    // p1 = 1 
    // p2 = 2 
    // p3 = [3, 4, 5] 
}

const myObject = { a: 1, b: 2, c: 3 }; 
const { a, ...x } = myObject; 
// a = 1 
// x = { b: 2, c: 3 }


let, const

之前的 javascript 沒有 local scoop 的概念, let, const 補足了這一塊

{
    var a = 100;
    let b = 200;
}
console.log(a) // 100;
console.log(b) // undefined;

includes

如果要在一個 array 裡面判斷是否包含某個值 在 ES7 之前的做法

const arr = ['react', 'angular', 'vue']; 
if (arr.indexOf('react') !== -1) { 
    // 存在
}

ES7 之後多了 Array.prototype.includes()

const arr = ['react', 'angular', 'vue']; 
if (arr.includes('react')) { 
    // 存在
}

指數運算

ES7 多了指數運算,非常方便

a ** b = Math.pow(a, b)

async / await

async / await 解決了 callbackk hell 的問題,也大幅提升了程式可讀性。而 async / await 也可以配合著 for 使用

async function process(array) { 
    for await (let i of array) {
        doSomething(i); 
    } 
}

Object.values()

此函數可以回傳不包括繼承而來的 value

const obj = {a: 1, b: 2, c: 3};

// 不使用 Object.values()
Object.keys(obj).map((key)=>{
    return obj[key];
});

// 使用 Object.values()
Object.values(obj);

// result =  1, 2, 3]

Object.entires()

此函數可以回傳不包括繼承而來的 key / value pair

const obj = {a: 1, b: 2, c: 3};

// 不使用 Object.entires()
Object.keys(obj).map((key)=>{
    return [key, obj[key]];
})

// 使用 Object.entires()
Object.entires(obj);
// result = [[a, 1], [b, 2], [c, 3]]

String padStart / padEnd

允許 string 補足給定的值到某個給定的長度

'abc'.padStart(10);         // "       abc"
'abc'.padStart(10, "foo");  // "foofoofabc"
'abc'.padStart(6,"123465"); // "123abc"
'abc'.padEnd(10);           // "abc       "

Promise.finally()

如果在 Promise 調用之後不管成功或者失敗都需要呼叫的函數可以使用 Promise.finally()

const doSomething() => {
     doSomething1()
        .then(doSomething2)
        .then(doSomething3)
        .catch(err => {
             console.log(err); 
            }
        )
        .finally(() => {
            // 不管結果如何一定被調用
        }); 
     }

Array.prototype.flat() / Array.prototype.flatMap()

flat() 會將一個 array 降低維度

const arr2 = [1, 2, [3, 4, [5, 6]]]; 
arr2.flat(); // [1, 2, 3, 4, [5, 6]] 
const arr3 = [1, 2, [3, 4, [5, 6]]]; 
arr3.flat(2); // [1, 2, 3, 4, 5, 6]
const arr4 = [1, 2, , 4, 5]; // 去除空資料
arr4.flat(); // [1, 2, 4, 5]

flatMap() 就是 flat() map() 結合體

const arr1 = [1, 2, 3, 4]; 
arr1.map(x => [x * 2]); // [[2], [4], [6], [8]] 
arr1.flatMap(x => [x * 2]); // [2, 4, 6, 8] // 只會將 flatMap 中的函數返回的數組 「壓平」 一層

String.trimStart() / String.trimEnd()

就是分別去除字符串首尾空白字符


Object.fromEntries()

Object.fromEntries() 則是 Object.entries() 的反轉。 透過 Object.fromEntires() 可以將 array 變成 object

const arr = [ ['0', 'a'], ['1', 'b'], ['2', 'c'] ]; 
const obj = Object.fromEntries(arr); 
console.log(obj); // { 0: "a", 1: "b", 2: "c" }

Reference

  1. https://kknews.cc/zh-tw/news/2kebemz.html
tags: Javascript