將arguments轉換成數組的方法

轉載:https://www.cnblogs.com/AliceX-J/p/5400568.html

將arguments轉換成數組的方法

將函數裏的arguments,轉換成一個真正的數組的方法,arguments是個類數組,除了有實參所組成的類似數組以外,還有自己的屬性,如callee,arguments.callee就是當前正在執行的這個函數的引用,它只在函數執行時才存在。因爲在函數開始執行時,纔會自動創建第一個變量arguments對象。

一、arguments這個類數組

  1. 它將實參以數組的形式保存着,還可以像數組一樣訪問實參,如arguments[0];
  2. 它也有自己獨特的屬性,如:callee,
  3. 它的長度是實參的個數。補充:那arguments.callee.length又是什麼呢?arguments.callee是當前正在執行的函數的引用,類似function.length,那就是形參的個數。

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

  1. Array.prototype.slice.apply(arguments)這是運行效率比較快的方法(看別人資料說的),爲什麼不是數組也可以,因爲arguments對象有length屬性,而這個方法會根據length屬性,返回一個具有length長度的數組。若length屬性不爲number,則數組長度返回0;所以其他對象只要有length屬性也是可以的喲,如對象中有屬性0,對應的就是arr[0],即屬性爲自然數的number就是對應的數組的下標,若該值大於長度,當然要割捨啦。
  2. Array.prototype.concat.apply(thisArg,arguments)。,thisArg是新的空數組,apply方法將函數this指向thisArg,arguments做爲類數組傳參給apply。根據apply的方法的作用,即將Array.prototype.slice方法在指定的this爲thisArg內調用,並將參數傳給它。用此方法注意:若數組內有數組,會被拼接成一個數組。原因是apply傳參的特性。
  3. 我自己想了個方法,利用Array的構造函數,如Array(1,2,3,4,5,6);可以返回一個傳入的參數的數組,那Array.apply(thisArg,arguments)也可以將arguments轉化爲數組,果然實驗是可以的;有沒有什麼影響呢,就是亂用了構造函數,但這也是js的特性嘛。構造函數也是函數。用此方法注意:若數組內有數組,會被拼接成一個數組。原因是apply傳參的特性。
  4. 用循環,因爲arguments類似數組可以使用arguments[0]來訪問實參,那麼將每項賦值給新的數組每項,直接複製比push要快,若實參有函數或者對象,就要深拷貝。

 

三、綜上所述,最完美的方法應該是Array.prototype.slice.apply(arguments)了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章