將 arguments 轉換成數組的方法

將函數裏的arguments,轉換成一個真正的數組的方法。數組

arguments是個類數組,除了有實參所組成的相似數組之外,還有本身的屬性,如calleearguments.callee就是當前正在執行的這個函數的引用,它只在函數執行時才存在。由於在函數開始執行時,纔會自動建立第一個變量arguments對象。app

1、arguments是個類數組

  • 它將實參以數組的形式保存着,還能夠像數組同樣訪問實參,如:arguments[0]函數

  • 它也有本身獨特的屬性,如:calleethis

  • 它的長度是實參的個數。prototype

    arguments.callee.length又是什麼呢?code

    arguments.callee是當前正在執行的函數的引用,相似function.length,那就是形參的個數。對象

2、將arguments轉換爲真正的數組的方法

1. Array.prototype.slice.apply(arguments)

這是運行效率比較快的方法(看別人資料說的),爲何不是數組也能夠,由於arguments對象有length屬性,而這個方法會根據length屬性,返回一個具備length長度的數組。若length屬性不爲number,則數組長度返回0io

因此其餘對象只要有length屬性也是能夠的喲,如對象中有屬性0,對應的就是arr[0],即屬性爲天然數的number就是對應的數組的下標,若該值大於長度,固然要割捨啦。function

2. Array.prototype.concat.apply(thisArg,arguments)

thisArg是新的空數組,apply方法將函數this指向thisArgarguments作爲類數組傳參給applyclass

根據apply的方法的做用,即將Array.prototype.slice方法在指定的thisthisArg內調用,並將參數傳給它。用此方法注意:若數組內有數組,會被拼接成一個數組。緣由是apply傳參的特性。

3. 我本身想了個方法,利用Array的構造函數

Array(1,2,3,4,5,6),能夠返回一個傳入的參數的數組。那Array.apply(thisArg,arguments)也能夠將arguments轉化爲數組,果真實驗是能夠的。

有沒有什麼影響呢,就是亂用了構造函數,但這也是 JS 的特性嘛,構造函數也是函數。

用此方法注意:若數組內有數組,會被拼接成一個數組。

緣由是apply傳參的特性。

4. 用循環

由於arguments相似數組可使用arguments[0]來訪問實參,那麼將每項賦值給新的數組每項,直接複製比push要快,若實參有函數或者對象,就要深拷貝。

3、綜上所述

最完美的方法應該是Array.prototype.slice.apply(arguments)了。

相關文章
相關標籤/搜索