將函數裏的arguments,轉換成一個真正的數組的方法,arguments是個類數組,除了有實參所組成的相似數組之外,還有本身的屬性,如callee,arguments.callee就是當前正在執行的這個函數的引用,它只在函數執行時才存在。由於在函數開始執行時,纔會自動建立第一個變量arguments對象。數組
1、arguments這個類數組app
- 它將實參以數組的形式保存着,還能夠像數組同樣訪問實參,如arguments[0];
- 它也有本身獨特的屬性,如:callee,
- 它的長度是實參的個數。補充:那arguments.callee.length又是什麼呢?arguments.callee是當前正在執行的函數的引用,相似function.length,那就是形參的個數。
2、將arguments轉換爲真正的數組的方法函數
- Array.prototype.slice.apply(arguments)這是運行效率比較快的方法(看別人資料說的),爲何不是數組也能夠,由於arguments對象有length屬性,而這個方法會根據length屬性,返回一個具備length長度的數組。若length屬性不爲number,則數組長度返回0;因此其餘對象只要有length屬性也是能夠的喲,如對象中有屬性0,對應的就是arr[0],即屬性爲天然數的number就是對應的數組的下標,若該值大於長度,固然要割捨啦。
- Array.prototype.concat.apply(thisArg,arguments)。,thisArg是新的空數組,apply方法將函數this指向thisArg,arguments作爲類數組傳參給apply。根據apply的方法的做用,即將Array.prototype.slice方法在指定的this爲thisArg內調用,並將參數傳給它。用此方法注意:若數組內有數組,會被拼接成一個數組。緣由是apply傳參的特性。
- 我本身想了個方法,利用Array的構造函數,如Array(1,2,3,4,5,6);能夠返回一個傳入的參數的數組,那Array.apply(thisArg,arguments)也能夠將arguments轉化爲數組,果真實驗是能夠的;有沒有什麼影響呢,就是亂用了構造函數,但這也是js的特性嘛。構造函數也是函數。用此方法注意:若數組內有數組,會被拼接成一個數組。緣由是apply傳參的特性。
- 用循環,由於arguments相似數組可使用arguments[0]來訪問實參,那麼將每項賦值給新的數組每項,直接複製比push要快,若實參有函數或者對象,就要深拷貝。
3、綜上所述,最完美的方法應該是Array.prototype.slice.apply(arguments)了this