Що таке псевдомасив?
Псевдомасив (array-like object) - це об'єкт,
який виглядає як масив, але не є справжнім масивом.
Він має:
- числові індекси (
0,1,2, ...), - властивість
length, - але не має методів масиву (
push,map,forEachтощо).
Приклади псевдомасивів:
1. arguments всередині функції
javascript
function showArgs() {
console.log(arguments);
}
showArgs(10, 20, 30);
// Arguments(3) [10, 20, 30, callee: ƒ, Symbol(Symbol.iterator): ƒ]arguments виглядає як масив, але:
javascript
console.log(arguments[0]); // 10
console.log(arguments.length); // 3
console.log(arguments.map); // undefined2. Колекції з DOM
javascript
const divs = document.querySelectorAll("div");
console.log(divs);NodeList і HTMLCollection - це теж псевдомасиви.
Вони містять елементи за індексами і length,
але не мають методів map, filter тощо.
Чому це не масив
Справжній масив успадковує методи від Array.prototype,
а псевдомасив - ні.
javascript
Array.isArray(arguments); // falseЯк перетворити псевдомасив на справжній масив
1. Через Array.from()
javascript
function demo() {
const arr = Array.from(arguments);
console.log(Array.isArray(arr)); // true
}
demo(1, 2, 3);2. Через spread-оператор (...)
javascript
function demo() {
const arr = [...arguments];
console.log(arr); // [1, 2, 3]
}
demo(1, 2, 3);3. Через slice.call()
javascript
function demo() {
const arr = Array.prototype.slice.call(arguments);
console.log(arr); // [1, 2, 3]
}
demo(1, 2, 3);Коротко:
| Властивість | Псевдомасив | Справжній масив |
|---|---|---|
| Є числові індекси | Так | Так |
Є length | Так | Так |
Є методи (map, push, filter) | Ні | Так |
Array.isArray() повертає true | Ні | Так |
Приклади псевдомасивів у JavaScript:
| Джерело | Тип |
|---|---|
arguments | псевдомасив аргументів функції |
document.querySelectorAll() | NodeList |
document.getElementsByClassName() | HTMLCollection |
FileList | список файлів з <input type="file"> |
Підсумок: Псевдомасив - це об'єкт, схожий на масив за структурою (
індекси + length), але без методів масиву.Щоб працювати з ним як зі звичайним масивом, можна перетворити його через
Array.from()або[...spread].
Коротка відповідь
Для співбесідиPremium
Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.