將函數里的arguments,轉換成一個真正的數組的方法,arguments是個類數組,除了有實參所組成的類似數組以外,還有自己的屬性,如callee,arguments.callee就是當前正在執行的這個函數的引用,它只在函數執行時才存在。因為在函數開始執行時,才會自動創建第一個變量arguments對象。
一、arguments這個類數組
- 它將實參以數組的形式保存着,還可以像數組一樣訪問實參,如arguments[0];
- 它也有自己獨特的屬性,如:callee,
- 它的長度是實參的個數。補充:那arguments.callee.length又是什么呢?arguments.callee是當前正在執行的函數的引用,類似function.length,那就是形參的個數。
二、將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要快,若實參有函數或者對象,就要深拷貝。
三、綜上所述,最完美的方法應該是Array.prototype.slice.apply(arguments)了