1. 程式人生 > 其它 >如何將類陣列轉化為陣列????

如何將類陣列轉化為陣列????

技術標籤:javascript

在學習轉化之前,我們要知道什麼是類陣列:

一個擁有 length 屬性和若干索引屬性的物件就可以被稱為類陣列物件

常見的類陣列物件有 arguments 和 DOM 方法的返回結果,還有一個函式也可以被看作是類陣列物件

舉一個栗子:

var array = ['boy','love','q'];
var arrayLink = {'1':'boy','2':'love','4':'q',length:5};
Array.prototype.join.call(arrayLink,'+');//'+bou+love++q'

Arguments 物件只定義在函式體中,包括了函式的引數和其他屬性。

function foo(name, age, sex) {
    console.log(arguments);
}
foo('name', 'age', 'sex')

在這裡插入圖片描述
我們可以看到這裡還有一個callee屬性:

該屬性是一個指標,指向擁有這個 arguments 物件的函式

function factorial(num){    
   if (num <=1) {         
      return 1;     
   } else {         
   return num * factorial(num-1)     
   } 
} 
//使用callee可以消除上面這種耦合 (函式執行和函式名的耦合)
function factorial1(num){ if (num <=1) { return 1; } else { return num * arguments.callee(num-1); } }

現在很少使用arguments.callee();

原因:訪問 arguments 是個很昂貴的操作,因為它是個很大的物件,每次遞迴呼叫時都需要重新建立。影響現代瀏覽器的效能,還會影響閉包。


那麼如何將類陣列轉化為陣列呢?
  • 通過 call 呼叫陣列的 slice 方法來實現轉換
Array.
prototype.slice.call(arrayLike);
  • 通過 call 呼叫陣列的 splice 方法來實現轉換
Array.prototype.splice.call(arrayLike, 0);
  • 通過 apply 呼叫陣列的concat 方法來實現轉換
Array.prototype.concat.apply([], arrayLike);
  • 通過 Array.from 方法來實現轉換
Array.from(arrayLike);