編寫高階函數,就是讓函數的參數可以接收別的函數。javascript
例: java
function add(x, y, f) { return f(x) + f(y); }
(1)map()
map()
方法定義在JavaScript的Array
中,調用Array
的map()
方法,傳入本身的函數,就獲得了一個新的Array
做爲結果
例: map()ArrayArraymap()Array
function pow(x) {
return x * x;
}
var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
var results = arr.map(pow); // [1, 4, 9, 16, 25, 36, 49, 64, 81]數組
map()傳入的參數爲函數;函數
例:網站
Array的把一個函數做用在這個的上,這個函數必須接收兩個參數,把結果繼續和序列的下一個元素作累積計算
例: var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9]; arr.map(String); // ['1', '2', '3', '4', '5', '6', '7', '8', '9'],將數組中的元素轉爲字符串,放到新數組
(2)reduce
reduce()Array[x1, x2, x3...]reduce()
[x1, x2, x3, x4].reduce(f) = f(f(f(x1, x2), x3), x4)
(3)練習題目
1.利用reduce()
求積:
答:
reduce()
function product(arr) {
return arr.reduce(function (x, y) {return x * y;});
}
function string2int(s) { 2.不要使用JavaScript內置的parseInt()
函數,利用map和reduce操做實現一個string2int()
函數:
答:
parseInt()string2int()
var arr=s.split('');
var arr2=arr.map(function(x){ return x*1});
var num=arr2.reduce(function (x, y) {return x * 10 + y;});
return num;spa
}code
3.請把用戶輸入的不規範的英文名字,變爲首字母大寫,其餘小寫的規範名字。輸入:,輸出:['adam', 'LISA', 'barT']['Adam', 'Lisa', 'Bart']
答:
function normalize(arr) {
var arr1=arr.map(function(x){return x.toUpperCase()});
var arr3=[]
for(let i=0;i<arr1.length;i++){
arr3[i]=arr1[i].substr(0,1)+arr1[i].substr(1).toLowerCase();
}
return arr3;
}
或
function normalize(arr) {
var arr2=arr.map(function(x){return x.substr(0,1).toUpperCase()+x.substr(1).toLowerCase()});//可直接得出結果
return arr2;
}
4.小明但願利用把字符串變成整數,他寫的代碼很簡潔:
var arr=['1','2','3'];
var r;
r = arr.map(parseInt);
結果居然是,小明百思不得其解,請幫他找到緣由並修正代碼。
答:
var arr = ['1', '2', '3'];
var r;
r = arr.map(function(x){return parseInt(x)});
出錯緣由:
map()1, NaN, NaN
因爲map()
接收的回調函數能夠有3個參數:callback(currentValue, index, array)
,一般咱們僅須要第一個參數,而忽略了傳入的後面兩個參數。orm
不幸的是,parseInt(string, radix)
沒有忽略第二個參數,致使實際執行的函數分別是:ip
parseInt('1', 0); // 1, 按十進制轉換字符串
parseInt('2', 1); // NaN, 沒有一進制
parseInt('3', 2); // NaN, 按二進制轉換不容許出現3
能夠改成r = arr.map(Number);
,由於Number(value)
函數僅接收一個參數。
參考廖雪峯老師的官方網站