JavaScript中的純函數,指的是在同樣輸入條件下,總是返回相同輸出結果的函數,同時沒有副作用。具備這些特性的函數在處理數據時,能夠保持穩定性和可預測性。
下面來看一個例子:我們有一個數組,要將它中的每個元素乘以2,再計算出所有元素的和。
const arr = [1, 2, 3, 4, 5]; // impure function function doubleAndSum(arr) { let sum = 0; for (let i = 0; i< arr.length; i++) { sum += arr[i] * 2; } return sum; } console.log(doubleAndSum(arr)); // 30
上面的函數雖然能夠正確地返回我們需要的結果,但它不是一個純函數。因為它在執行的過程中,修改了作為輸入的數組變量sum。
我們再寫一個版本的doubleAndSum函數:
// pure function function doubleAndSumPure(arr) { return arr.map((num) =>num * 2).reduce((a, b) =>a + b, 0); } console.log(doubleAndSumPure(arr)); // 30
這個版本是一個純函數,不僅能夠正確返回結果,而且不會修改原始數組或其他外部變量。
純函數有以下的優點:
- 代碼更加直觀易懂。因為輸入和輸出結果明確,不需要考慮函數執行過程中可能帶來的影響。
- 便于測試。測試純函數時,只需要傳入不同的輸入,比較結果是否符合預期即可。
- 可緩存。由于相同輸入總是返回相同輸出,可以將結果緩存,提升程序性能。
下面再來看一個例子,實現一個純函數,將一個字符串中的所有字母倒序排列:
// pure function function reverseString(str) { return str.split('').reverse().join(''); } console.log(reverseString('hello')); // 'olleh' console.log(reverseString('world')); // 'dlrow'
純函數的使用不僅局限于單個函數,也可以在一個應用程序或系統的整個設計中使用。通過確保所有函數都是純函數,能夠降低bug的出現率和程序出現問題的概率。