對Array.prototype.slice.call()方法的理解


在看別人代碼時,發現有這么個寫法:[].slice.call(arguments, 0),這到底是什么意思呢?

1、基礎

1)slice() 方法可從已有的數組中返回選定的元素。

start:必需。規定從何處開始選取。如果是負數,那么它規定從數組尾部開始算起的位置。也就是說,-1 指最后一個元素,-2 指倒數第二個元素,以此類推。

end:可選。規定從何處結束選取。該參數是數組片斷結束處的數組下標。如果沒有指定該參數,那么切分的數組包含從 start 到數組結束的所有元素。如果這個參數是負數,那么它規定的是從數組尾部開始算起的元素。

返回一個新的數組,包含從 start 到 end (不包括該元素)的 arrayObject 中的元素。該方法並不會修改數組,而是返回一個子數組。

2)call()和apply()方法都是在特定的作用域中調用函數,實際上等於設置函數體內this對象的值。apply和call方法的第一個參數都是特定的作用域第二個參數不同,apply第二個參數可以是Array的實例,也可以是arguments對象。call方法需要逐個列出需要傳遞的參數。

3)arguments對象指數與數組類似(它並不是Array的實例),但是可以使用方括號語法訪問每一個元素,使用length來確定傳遞進來多少個參數。

4)Array.prototype.slice.call()可以理解為:改變數組的slice方法的作用域,在特定作用域中去調用slice方法,call()方法的第二個參數表示傳遞給slice的參數即截取數組的起始位置。

2、原理

Array.prototype.slice.call(arguments)能將具有length屬性的對象(key值為數字)轉成數組。[]是Array的示例,所以可以直接使用[].slice()方法。

var obj = {0:'hello',1:'world',length:2};
console.log(Array.prototype.slice.call(obj,0));//["hello", "world"]

沒有length屬性的對象

var obj = {0:'hello',1:'world'};//沒有length屬性
console.log(Array.prototype.slice.call(obj,0));//[]

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM