思路:給數組先排序(由大到小排序),第一項就是最大值javascript
let arr = [1,5,6,7,9,20,40,2,3]; let max1 = arr.sort(function(a,b){ return b-a; })[0]; console.log(max1);
思路:假設第一個值是最大值,依次遍歷數組中後面的每一項,和假設的值進行比較,若是比假設的值要大,把當前項賦值給MAX...java
let arr = [1,5,6,7,9,20,40,2,3]; let max2 = arr[0]; for(let i = 1; i <= arr.length; i++){ let item = arr[i]; item > max2 ? max2 = item : null; } console.log(max2);
思路:基於基於Math.max完成和apply特性數組
let arr = [1,5,6,7,9,20,40,2,3]; console.log(Math.max.apply(null, arr));
這個是要重點理解的一個方案,call,apply,bind經常會被放一塊兒比較
首先,call,apply,bind這三個方法其實都是繼承自Function.prototype中的,屬於實例方法。
三個方法的做用,都是改變this的指向,只是用法稍微有些區別app
什麼是this函數
this 既不指向函數自身,也不指函數的詞法做用域。它在函數定義的時候是肯定不了的,在函數被調用時才發生的綁定,也就是說this具體指向什麼,取決於你是怎麼調用的函數
。this
怎麼判斷thisprototype
1.給當前元素的某個事件綁定方法, 當事件觸發方法執行的時候,方法中的THIS是當前操做的元素對象
2.普通函數執行,函數中的THIS取決於執行的主體,誰執行的,THIS就是誰(執行主體:方法執行,看方法名前面是否有「點」,有的話,點前面是誰this就是誰,沒有this是window)
下面看個例子:
function myFunction(){ console.log(this===window); } var obj = { myFunction(){ console.log(this===obj); } } myFunction();//true obj.myFunction();//true
對this有了大體瞭解後,再來看call方法code
window.name = 'windowName'; let fn = function(){ console.log(this.name); } let obj = { name:'objName' } let obj1 = { name:'obj1Name' } fn();//windowName fn.call(obj);//objName:雖然是fn調用,但call改變了this指向,this的指向是obj,故obj.name的值爲objName fn.call(obj1);//obj1Name
call方法執行的時候,內部處理了一些事情。首先把要操做函數中的this關鍵字變爲call方法第一個傳遞的實參值,把call方法第二個及第二個之後的實參獲取到,把要操做的函數執行,而且把第二個之後的傳遞進來的實參傳給函數對象
function fn(a, b) { console.log(a + b); } fn.call(null, 1, 2); //3
CALL中的細節排序
1.非嚴格模式下,若是參數不傳,或者第一個傳遞的是null/undefined,this都指向window
2.在嚴格模式下,第一個參數是誰,this就指向誰(包括null/undefined),不傳this是undefined
在上述代碼中,若是用apply,則是
function fn(a, b) { console.log(a + b); } fn.apply(null, [1, 2]); //3
apply:和call基本上如出一轍,惟一區別在於傳參方式
fn.call(obj,10,20) fn.apply(obj,[10,20]) //APPLY把須要傳遞給FN的參數放到一個數組(或者類數組)中傳遞進去,雖然寫的是一個數組,可是也至關於給FN一個個的傳遞
bind:語法和call如出一轍,惟一的區別在於當即執行仍是等待執行
fn.call(obj,10,20) 改變FN中的THIS,而且把FN當即執行 fn.bind(obj,10,20) 改變FN中的THIS,此時的FN並無執行(不兼容IE6~8)
bind調用以後是返回原函數,須要再調用一次才行
回到原題,求數組最大值
Math.max(arr)這樣確定是報錯的
console.log(Math.max(ary));//=>NaN //=>Math.max是獲取一堆數中的最大值,須要咱們把比較的數,一個個的傳遞給這個方法 //=>Math.max(12,13,14...) =>Math.max([12,13,14...])這樣只是傳遞一個值 Math.max.apply(null,arr); //=>利用了apply的一個特徵:雖然放的是一個數組,可是執行方法的時候,也是把數組中的每一項一個個的傳遞給函數
console.log(Math.max(...arr));