1. 程式人生 > 其它 >瞭解JavaScript中的偽陣列

瞭解JavaScript中的偽陣列

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 ]