深刻理解JavaScript(三):獲取數組中的最大值方法(this,apply)

1.排序法

思路:給數組先排序(由大到小排序),第一項就是最大值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);

2.假設法

思路:假設第一個值是最大值,依次遍歷數組中後面的每一項,和假設的值進行比較,若是比假設的值要大,把當前項賦值給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);

3.基於Math.max與apply

思路:基於基於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具體指向什麼,取決於你是怎麼調用的函數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的一個特徵:雖然放的是一個數組,可是執行方法的時候,也是把數組中的每一項一個個的傳遞給函數

4.ES6展開運算符

console.log(Math.max(...arr));
相關文章
相關標籤/搜索