將細節隱藏起來的作法,站在更高的層次上討論問題
假設要多次執行 console.log,可由 for loop 來表示..
for (let i=0;i<10;i++){
console.log(i);
}
也可以將『動作』作為 parameter 傳遞,以函式來表達『做某件事』在要用到的情況下才建立函式值,這樣更簡單
function repeat( n,action ){
for(let i = 0; i < n; i++){
action(i);
}
}
repeat(3, console.log);
高階函式的特點為接受一個或多個函式作為 parameter 或是回傳值,高階ㄧ詞來自於數學
高階函式可隱藏複雜性,並清晰表達意圖,因此有助於函式的抽象化表達
舉例來說像 filter 便隱藏了 loop 的複雜性,不需寫額外 loop 來執行 filter,只需簡單的使用 filter()
即可
let numbers = [2, 4, 6, 8, 10];
function multiplier(val, array) {
return array.map((n) => n * val);
}
console.table(multiplier(3, numbers)); // [6, 12, 18, 24, 30]
如果 filter 的 callback function 僅執行 return value,會將 falsy value 篩掉
let filterTarget = [0, 1, 3, 5, NaN, null, 7, undefined, 9, 11];
console.log(filterTarget.filter((x) => x)); // [1, 3, 5, 7, 9, 11]
forEach 跟 for..of 的差異
name | 差異與用途 |
---|---|
forEach | 不可中斷,用於簡單的迭代(simple, non-iteration loops) |
for..of | 可用 break 中斷,continue 繼續,且適用於在 loop 中執行 asynchronous operations |
reduce
some
只要被傳入的陣列內有一項元素符合 callback function 條件,則 return true,反之則 return false
let target = [17, 35, 53, 1, 9, 13];
function findIsEven(array) {
return array.some((n) => n % 2 === 0);
}
console.log(findIsEven(target)); // false