Я много раз встречался с термином "Array-Like Object" в javascript. Что это? В чем разница между ним и нормальным массивом? Какая разница между объектами, подобными массиву, и нормальным объектом?
Javascript - Разница между массивом и массивом
Ответ 1
Что это?
Объект, имеющий свойство длины неотрицательного целого и обычно некоторые индексированные свойства. Например
var ao1 = {length: 0}, // like []
ao2 = {0: 'foo', 5: 'bar', length: 6}; // like ["foo", undefined × 4, "bar"]
Вы можете конвертировать Array-подобные объекты в свои массивы с помощью Array.prototype.slice
var arr = Array.prototype.slice.call(ao1); // []
В чем разница между ним и нормальным массивом?
Он не создан Array
или с литералом Array []
, и поэтому (обычно) не будет наследоваться от Array.prototype
. Свойство length обычно не будет автоматически обновляться.
ao1 instanceof Array; // false
ao1[0] = 'foo';
ao1.length; // 0, did not update automatically
В чем разница между похожим на массив объектом и нормальным объектом?
Нет никакой разницы. Даже обычные массивы - объекты в JavaScript
ao1 instanceof Object; // true
[] instanceof Object; // true
Ответ 2
Знаменитая HTMLCollection
(документация) и arguments
(документация) являются объектами в виде массивов, которые создаются автоматически.
Некоторые быстрые различия, подобные массиву (например, HTMLCollection
) между примерами реальных массивов:
var realArray = ['value1', 'value2'];
var arrayLike = document.forms;
сходства:
Длина получателя одинакова:
arrayLike.length; // returns 2;
realArray.length; // returns 2; //there are 2 forms in the DOM.
Индексированный геттер такой же:
arrayLike[0]; // returns an element.
realArray[0]; // returns an element. ('value')
Они оба являются objects
:
typeof arrayLike; // returns "object"
typeof realArray; // returns "object"
Отличия:
В массиве-подобно join()
, concat()
, includes()
в includes()
и т.д., методы не являются функции:
arrayLike.join(", "); // returns Uncaught TypeError: arrayLike.join is not a function (also relevant to 'concat()', 'includes()' etc.)
realArray.join(", "); // returns "value1, value2"
Массив вроде не совсем массив:
Array.isArray(arrayLike); //returns "false"
Array.isArray(realArray); //returns "true"
В массиве, как вы не можете установить свойство длины:
arrayLike.length = 1;
arrayLike.length; //return 2; //there are 2 forms in the DOM.
realArray.length = 1;
realArray.length; //return 1;
Ответ 3
Я думаю, в ES6 что-то похоже на Array, если оно итерируется (имеет свойство [Symbol.iterator]
).