前言
取出數(shù)組中的最大值或者最小值是開發(fā)中常見的需求轮傍,但你能想出幾種方法來實(shí)現(xiàn)這個(gè)需求呢?
Math.max
JavaScript 提供了 Math.max 函數(shù)返回一組數(shù)中的最大值不同,用法是:
Math.max([value1[,value2, ...]])
值得注意的是:
- 如果有任一參數(shù)不能被轉(zhuǎn)換為數(shù)值,則結(jié)果為 NaN溶耘。
- max 是 Math 的靜態(tài)方法二拐,所以應(yīng)該像這樣使用:Math.max(),而不是作為 Math 實(shí)例的方法 (簡單的來說凳兵,就是不使用 new )
- 如果沒有參數(shù)百新,則結(jié)果為
-Infinity
(注意是負(fù)無窮大)
而我們需要分析的是:
1.如果任一參數(shù)不能被轉(zhuǎn)換為數(shù)值,這就意味著如果參數(shù)可以被轉(zhuǎn)換成數(shù)字庐扫,就是可以進(jìn)行比較的饭望,比如:
Math.max(true, 0) // 1
Math.max(true, '2', null) // 2
Math.max(1, undefined) // NaN
Math.max(1, {}) // NaN
2.如果沒有參數(shù),則結(jié)果為 -Infinity形庭,對(duì)應(yīng)的铅辞,Math.min 函數(shù),如果沒有參數(shù)碘勉,則結(jié)果為 Infinity巷挥,所以:
var min = Math.min();
var max = Math.max();
console.log(min > max);
了解了 Math.max 方法,我們以求數(shù)組最大值的為例验靡,思考有哪些方法可以實(shí)現(xiàn)這個(gè)需求倍宾。
原始方法
最最原始的方法雏节,莫過于循環(huán)遍歷一遍:
var arr = [6, 4, 1, 8, 2, 11, 23];
var result = arr[0];
for (var i = 1; i < arr.length; i++) {
result = Math.max(result, arr[i]);
}
console.log(result);
reduce
既然是通過遍歷數(shù)組求出一個(gè)最終值,那么我們就可以使用 reduce 方法:
var arr = [6, 4, 1, 8, 2, 11, 23];
function max(prev, next) {
return Math.max(prev, next);
}
console.log(arr.reduce(max));
排序
如果我們先對(duì)數(shù)組進(jìn)行一次排序高职,那么最大值就是最后一個(gè)值:
var arr = [6, 4, 1, 8, 2, 11, 23];
arr.sort(function(a,b){return a - b;});
console.log(arr[arr.length - 1])
eval
Math.max 支持傳多個(gè)參數(shù)來進(jìn)行比較钩乍,那么我們?nèi)绾螌⒁粋€(gè)數(shù)組轉(zhuǎn)換成參數(shù)傳進(jìn) Math.max 函數(shù)呢?eval 便是一種
var arr = [6, 4, 1, 8, 2, 11, 23];
var max = eval("Math.max(" + arr + ")");
console.log(max)
apply
使用 apply 是另一種怔锌。
var arr = [6, 4, 1, 8, 2, 11, 23];
console.log(Math.max.apply(null, arr))
ES6 ...
使用 ES6 的擴(kuò)展運(yùn)算符:
var arr = [6, 4, 1, 8, 2, 11, 23];
console.log(Math.max(...arr))