Массивоподобные объекты (псевдомассивы)

В языке JavaScript очень часто методы возвращают массивоподобные объекты (псевдомассивы). Такие объекты имеют свойства с именами в виде индексов и свойство length, содержащее количество элементов. Обратиться к элементам можно точно так же, как к элементам массива, указав индекс внутри квадратных скобок. В отличие от массивов такие объекты не являются наследниками класса Array и не содержат его методов. Примером массивоподобного объекта является объект arguments, позволяющий внутри функции получить доступ ко всем переданным параметрам:

function test() {
   console.log(arguments);
   console.log(arguments.length);
   console.log(arguments[0]);
}
test(55);
// [Arguments] { '0': 55 }
// 1
// 55
test(80, 66, 17);
// [Arguments] { '0': 80, '1': 66, '2': 17 }
// 3
// 80

Давайте создадим массивоподобный объект:

let obj = {
   0: 20,
   1: 30,
   2: 40,
   length: 3
};
console.log( obj[0] ); // 20
console.log( obj[1] ); // 30
console.log( obj[2] ); // 40
for (let i = 0; i < obj.length; i++) {
   console.log( obj[i] );
}

Для преобразования массивоподобного объекта в полноценный массив можно воспользоваться статическим методом from() из класса Array:

let arr = Array.from(obj);
console.log(arr);      // [ 20, 30, 40 ]

Если объект поддерживает итерации, то можно воспользоваться оператором SPREAD. Наш объект не поддерживает итерации, поэтому получим сообщение об ошибке, а вот объект arguments итерации поддерживает:

function test() {
   let arr1 = Array.from(arguments);
   console.log(arr1);     // [ 10, 20, 30 ]
   let arr2 = [...arguments];
   console.log(arr2);     // [ 10, 20, 30 ]
}
test(10, 20, 30);

Что же нам делать, если нужно использовать методы класса Array, а преобразовывать объект в массив не хочется? Для этого можно воспользоваться методом call():

let obj = {
   0: 20,
   1: 30,
   2: 40,
   length: 3
};
console.log( Array.prototype.indexOf.call(obj, 40) ); // 2
console.log( [].indexOf.call(obj, 30) );              // 1

Совместное использование методов slice() и call() позволяет преобразовать массивоподобный объект в настоящий массив:

let arr1 = Array.prototype.slice.call(obj);
console.log(arr1);     // [ 20, 30, 40 ]
let arr2 = [].slice.call(obj);
console.log(arr2);     // [ 20, 30, 40 ]

Учебник по Node.js и JavaScript
Учебник по JavaScript (Node.js) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов