1. 程式人生 > > [].shift.call( arguments ) 和 [].slice.call( arguments ) 祥解

 [].shift.call( arguments ) 和 [].slice.call( arguments ) 祥解

[].slice.call( arguments )
// 等效於
Array.prototype.slice.call( arguments )

個人理解:
要把arguments 轉為陣列物件!
本著 能少寫就少寫,能不寫就不寫的想法,想到slice():可從已有的陣列中返回選定的元素。
slice 不會改變原來的陣列,而是返回一個子陣列。

let kindle = [1,2,3,4,5,6,7]
console.log(kindle.slice())  // [ 1, 2, 3, 4, 5, 6, 7 ]

那麼下一個問題又來了,arguments 不是陣列物件,不能呼叫陣列的方法。
arguments想要轉為陣列物件,怎麼轉? for迴圈等。。。

但是能少寫就少寫,能不寫就不寫
這時候又要解鎖一個call函式,或者 apply 函式。這兩個函式都可以改變函式 this 的指向,函式執行時的作用域。區別就是引數不一樣,第一個引數都是一個物件或者 ‘this’ 注意this加引號了, apply第二個引數接收一個數組,call則不是,call可以有n個引數有多少放多少就行

call函式詳解點選這裡

slice 方法原理就是根據傳入的引數(值)對原陣列(或者類陣列)進行遍歷獲取,賦給新陣列然後返回。如果沒有引數便複製整個原陣列(或者類陣列),後賦給新陣列然後返回。

重點來了
因為slice內部實現是使用的this代表呼叫物件。那麼當[].slice.call() 傳入 arguments物件的時候,通過 call函式改變原來 slice方法的this指向, 使其指向arguments,並對arguments進行復制操作,而後返回一個新陣列。至此便是完成了arguments類陣列轉為陣列的目的!

其實這可以理解為,讓類陣列呼叫陣列的方法!

[].shift.call( arguments )

[].shift.call( arguments ) 這便是一個例子。
shift() 方法刪除陣列第一項,並返回刪除項。
根據上邊的理解,這句程式碼意思就是: “刪除並拿到arg