[].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循環等。。。app
可是能少寫就少寫,能不寫就不寫
這時候又要解鎖一個call函數,或者 apply 函數。這兩個函數均可以改變函數 this 的指向,函數運行時的做用域。區別就是參數不同,第一個參數都是一個對象或者 ‘this’ 注意this加引號了, apply第二個參數接收一個數組,call則不是,call能夠有n個參數有多少放多少就行函數
call函數詳解點擊這裏this
slice 方法原理就是根據傳入的參數(值)對原數組(或者類數組)進行遍歷獲取,賦給新數組而後返回。若是沒有參數便複製整個原數組(或者類數組),後賦給新數組而後返回。prototype
重點來了
由於slice內部實現是使用的this表明調用對象。那麼當[].slice.call() 傳入 arguments對象的時候,經過 call函數改變原來 slice方法的this指向, 使其指向arguments,並對arguments進行復制操做,然後返回一個新數組。至此即是完成了arguments類數組轉爲數組的目的!對象
其實這能夠理解爲,讓類數組調用數組的方法!作用域
[].shift.call( arguments )console
[].shift.call( arguments ) 這即是一個例子。
shift() 方法刪除數組第一項,並返回刪除項。
根據上邊的理解,這句代碼意思就是: 「刪除並拿到arguments的第一項」for循環