apply的理解和陣列降維

看風景就發表於2018-10-11
func.apply(thisObj, [argArray] );

apply方法用來改變函式執行時的this指向,後面的引數是一個類陣列物件,可以是陣列,arguments,甚至一個有length屬性的物件 { length: 3 }

apply有一個重要的作用,就是可以將  陣列引數  轉換為  引數列表,也就是可以 對一個陣列應用原本只支援引數列表的函式。

例如:

Math.max(param1, param2....)

Array.prototype.push(param1, param2...)

Array.prototype.concat(param1, param2...)

這些只支援引數列表的函式,不能直接傳入陣列,但是通過apply方法,就可以將一個陣列傳進去,得到該陣列作為引數的結果。

//apply傳入null,則轉換為全域性物件,window或global
Math.max.apply(null, arr)  <=>   global.max(arr[0], arr[1], arr[2] .....)  

//這裡的null只是佔位,傳入任何值都行,max和min函式中this不起作用,傳個123,結果也一樣
Math.min.apply(null, arr)  <=>   global.min(arr[0], arr[1], arr[2] ......) 

//注意concat後面的arr2不是以整體的形式去連線,而是以打碎的形式去連線
Array.prototype.concat(arr1, arr2) <=>  arr1.concat(arr2[0], arr2[1], arr2[3] ......) 

Array.prototype.push(arr1, arr2)   <=>  arr1.push(arr2[0], arr2[1], arr2[3] ......)

總之,apply就是將後面的陣列引數打碎傳入函式呼叫。 

下面是一個經典的利用apply對陣列降維的例子:

Array.prototype.concat.apply([], arr2d)

一個空陣列,apply呼叫concat,將後面的二維陣列打碎,concat本身又將一維陣列打碎,連線成一個一維陣列。

過程如下:

Array.prototype.concat.apply([], arr2d) <=>  [].concat(arr2d[0],arr2d[1],arr2d[2]...)
//arr2d[0],arr2d[1],arr2d[2]...本身也是陣列,會被concat再次打碎,合併進前面的空陣列,這樣
//經過兩次打碎,一個二維陣列就降維成一個一維陣列                                             

相關文章