瞭解JavaScript中的偽陣列
阿新 • • 發佈:2021-06-26
1.什麼是偽陣列
JavaScript中存在有一種類陣列,或者說偽陣列。經常見到的偽陣列有函式的arguments物件、dom.querySelectorAll等獲取的NodeList類(NodeList本身具有forEach方法)等。
偽陣列並不是陣列,它沒有繼承Array.prototype,但是它“看起來像陣列”,它本身沒有陣列的標準方法,但是它可以複用這些標準方法。
例子
function arrayLike() {
arguments.forEach(a => console.log(a));//TypeError: arguments.forEach is not a function
}
arrayLike(1, 2, 3);
如上例所示,arguments物件本身並沒有forEach方法,但是它可以複用陣列的這些標準方法。
例子
function arrayLike() {
// arguments.forEach(a => console.log(a));
[].forEach.call(arguments, a => console.log(a));// 1 2 3 通過call改變this指向,呼叫陣列的方法
[...arguments].forEach(a => console.log(a));// 1 2 3 構建一個真實陣列,然後呼叫陣列的方法
}
arrayLike(1, 2, 3);
2.如何建立一個偽陣列物件
一個數組物件必然具有兩個特點:
具有一個範圍在0~232-1的整型length屬性
length屬性大於該物件的最大索引,索引是一個0-232-2範圍內的整數
所以很簡單,只要實現這兩個特點,一個物件就是偽陣列物件了。
例子
const arr = {
1: 'AAA',
3: 'CCC',
length: 8,
};
[].forEach.call(arr, (item, i) => console.log(item, i)); //AAA 1 CCC 3
https://www.98891.com/article-77-1.html
3.陣列的concat方法
對於陣列和偽陣列,在陣列的標準方法中,只有concat方法是不通用的,對於一個偽陣列,concat方法會將其作為一個整體連線起來。
例子
console.log([].concat.call(arr, [7, 8]));//[ { '1': 'AAA', '3': 'CCC', length: 8 }, 7, 8 ]
console.log([1, 2].concat([7, 8]));//[ 1, 2, 7, 8 ]
上例展示了陣列和偽陣列呼叫concat的不同結果,在遇到這種情況時,我們只有自己對偽陣列進行轉換,比如:
1.通過slice方法,複製偽陣列
console.log([].concat.call([].slice.call(arr), [7, 8]));
//[ <1 empty item>, 'AAA', <1 empty item>, 'CCC', <4 empty items>, 7, 8 ]
2.通過Symbol.isConcatSpreadable改變對偽陣列物件進行concat操作時的預設行為
const arr = {
1: 'AAA',
3: 'CCC',
length: 8,
[Symbol.isConcatSpreadable]: true,
};
console.log([].concat.call(arr, [7, 8]));
//[ <1 empty item>, 'AAA', <1 empty item>, 'CCC', <4 empty items>, 7, 8 ]