不變性
在傳統的面嚮物件語言中,x = x + 1
是一種簡單而合法的表達方式。但在功能程式設計中,它是非法的。
功能程式設計中不存在變數。由於歷史記錄,儲存的值仍稱為變數。實際上,它們是常數。一旦 x
取值,它就是生命的價值。
那麼,如果變數是常數,那麼我們如何改變它的值呢?
函數語言程式設計通過使用更改的值建立記錄的副本來處理記錄中值的更改。
例如,而不是做:
var numbers = [1, 2, 3];
numbers[0] += 1; // numbers = [2, 2, 3];
你做:
var numbers = [1, 2, 3];
var newNumbers = numbers.map(function(number) {
if (numbers.indexOf(number) == 0)
return number + 1
return number
});
console.log(newNumbers) // prints [2, 2, 3]
功能程式設計中沒有迴圈。我們使用遞迴或更高階函式,如 map
,filter
和 reduce
來避免迴圈。
讓我們在 JavaScript 中建立一個簡單的迴圈:
var acc = 0;
for (var i = 1; i <= 10; ++i)
acc += i;
console.log(acc); // prints 55
通過將 acc
的生命週期從全域性變為本地,我們仍然可以做得更好:
function sumRange(start, end, acc) {
if (start > end)
return acc;
return sumRange(start + 1, end, acc + start)
}
console.log(sumRange(1, 10, 0)); // 55
沒有變數或迴圈意味著更簡單,更安全和更易讀的程式碼(特別是在除錯或測試時 - 在一些語句之後你不需要擔心 x
的值,它永遠不會改變)。