Что такое псевдо массив/объект?

636
26 ноября 2016, 18:00

Например есть такой объект как arguments доступный внутри любой функции.

  1. В текстах его называют псевдо-массив, а не просто массив.
  2. Из него не получается сделать JSON строку.

Пожалуйста объясните два этих пункта.

Answer 1

Псевдомассив - это объект, структура которого совпадает со структурой массива (т.е. он хранит элементы в индексах от 0 до length-1), но при этом он не обладает методами, свойственными полноценным массивам из-за отличий в прототипе.

Сделать свой псевдомассив довольно просто:

var a = {0 : 'foo', 1: 'bar', length: 2};

Теперь a - псевдомассив из 2х элементов. К ним можно обращаться по индексам - a[0], a[1] - но у него нет таких методов как sort, slice, concat, forEach. JSON-сериализатор также сериализует его не как массив, а как объект.

В стандартной библиотеке javascript единственным классом псевдомассивов является Arguments, который представлен специальным объектом arguments в каждой регулярной функции.

Также в браузерном javascript псевдомассивами являются экземпляры классов NodeList, HTMLCollection и подобных, возвращаемые некоторыми функциями для работы с DOM, такими как document.getElementsByXXX().

Любую функцию, работающую с массивом, можно применить к псевдомассиву при помощи call:

a.sort(); // Ошибка: в псевдомассиве нет метода sort
Array.prototype.sort.call(a); // А вот так - работает
[].sort.call(a); // И так тоже работает

Также псевдомассив можно превратить в нормальный массив при помощи slice:

Array.prototype.slice.call(a); // ["foo", "bar"]
READ ALSO
Что в Javascript значит синтакс ( function(){…} )( param1, param2); ?

Что в Javascript значит синтакс ( function(){…} )( param1, param2); ?

Столкнулся в этом примере с синтаксисом, который раньше не встречал:

320
Передача Json c AngularJS на PHP (Slim framework)

Передача Json c AngularJS на PHP (Slim framework)

Нужно передать JSON с ангуляра, вот набросок кода:

344
JavaScript: Array - возврат наименьшего и наибольшего значения из массива

JavaScript: Array - возврат наименьшего и наибольшего значения из массива

Есть код, который принимает массив и должен вернуть отсортированный массив из двух элементов, первый - это наименьшее, второй наибольшее...

270
Как работают замыкания в JavaScript

Как работают замыкания в JavaScript

Как сказал Альберт Эйнштейн:

255