如何將類陣列轉化為陣列????
阿新 • • 發佈:2021-02-09
技術標籤: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);