函數式編程
特點
Pure & Impure
//Pure functions
function square(x) {
return x * x;
}
function squareAll(items) {
return items.map(square);
}
//Impure functions
function square(x) {
return x * x;
}
function squareAll(items) {
for (let i = 0; i < items.length; i++) {
item[i] = square(items[i]);//It modified the incoming data;
}
}
slice & splice
mostly-adequate-guide
In functional programming, we dislike unwieldy functions likesplice
that mutate data.
let xs = [1, 2, 3, 4, 5];
// Impure
xs.splice(0, 3);
//=> [1,2,3]
xs.splice(0, 3);
//=> [4,5]
xs.splice(0, 3);
//=> []
// Pure
xs.slice(0, 3);
//=> [1,2,3]
xs.slice(0, 3);
//=> [1,2,3]
xs.slice(0, 3);
//=> [1,2,3]
// Impure
let minimum = 21;
let checkAge = function(age) {
return age >= minimum;
};
// Pure
let checkAge = function(age) {
let minimum = 21;
return age >= minimum;
};
Immutable & Mutable
//Mutable
function addOne(numArray: any[]): any[] {
for (let x in numArray) {
numArray[x] = numArray[x] + 1;
}
return numArray;
}
function addOne(numArray: any[]): any[] {
let addedArray: any[];
for (let x in numArray) {
addedArray[x] = numArray[x] + 1;
}
return addedArray;
}
function addOne(numArray: any[]): any[] {
let addedArray: any[] = new Array();
for (let x of numArray) {
addedArray.push(x + 1);
}
return addedArray;
}
function addOne(numArray: any[]): any[] {
let addedArray: any[];
numArray.forEach((element, index) => {
addedArray[index] = element + 1;
});
return addedArray;
}
//Immutable
function addOne(numArray: any[]): any[] {
return numArray.map((item) => {
return item + 1;
})
}
let a = [1, 2, 3, 4, 5];
Object.freeze(a);
console.log(addOne(a));
what’s the difference between foreach & map?
foreach
其他示例
函數式編程中的循環
//for loop
function accumulate(n) {
let result = 0;
for (n; n > 0; n--) {
result = n + result;
}
return result;
}
//Recursive loop
function accumulate(n) {
if (n === 0) {
return 0;
} else {
return n + accumulate(n - 1);
}
}
尾調用優化
http://www.ruanyifeng.com/blog/2015/04/tail-call.html
//Recursive loop
function accumulate(n) {
if (n === 0) {
return 0;
} else {
return n + accumulate(n - 1);
}
}
//Tail Call Optimization
"use strict";
function accumulate(n, result) {
if (n === 0) {
return result;
} else {
return accumulate(n - 1, n + result);
}
}