В чем разница между массивом JavaScript и объектом, кроме свойства .length? - PullRequest
5 голосов
/ 30 июля 2010

Как я думаю, массив JS - это просто хэш-карта, которая принимает в качестве ключа только целое значение. А свойство .length просто возвращает наибольший индекс + 1.

Это правильно? Есть ли другие отличия?

Ответы [ 4 ]

3 голосов
/ 30 июля 2010

Вы не правы;Массивы могут иметь любые ключи.

Кроме того, они наследуют прототип Array.

1 голос
/ 30 июля 2010

Разница:

Object.prototype.toString.call([]); // [object Array]
Object.prototype.toString.call({}); // [object Object]

Edit:

Кроме того, посмотрите на этот раздел из спецификаций ECMAScript, так как он точно объясняет, что такое массив: http://bclary.com/2004/11/07/#a-15.4

1 голос
/ 30 июля 2010

Массив JavaScript также наследуется от Object, поэтому он получит все возможности объекта. Массивы JavaScript имеют дополнительную функциональность:

var myA = ['foo', 'bar', 'baz'];
var myO = {0: 'foo', 1: 'bar', 2: 'baz'};

// these both give us "foo":
console.log(myA[0]);
console.log(myO[0]);

// array has additional methods, though:
console.log(myA.pop());
console.log(myO.pop()); // <- error

Хотя вы можете добавлять целочисленные свойства к обычным объектам и добавлять нецелочисленные свойства к массивам, это не даст объекту специальных свойств и методов, которыми обладает массив, а специальные функции массива применяются только к его целочисленным свойствам.

Хорошей ссылкой на все дополнительные свойства, которые наследуют массивы, является статья Mozilla Developer Center о массиве . Обязательно обратите внимание на небольшие заметки «нестандартный» и «Требуется JavaScript 1.x», если вы хотите поддерживать кросс-браузерную совместимость.

0 голосов
/ 30 июля 2010

Объекты массива могут иметь любое свойство, которое может иметь объект.Единственное специальное свойство - это свойство «length», которое (потенциально) обновляется при установке свойства «индекс массива» и может также использоваться для удаления элементов массива, если для него установлено более низкое значение, чем его текущее значение.

«Индексы массива» - это строки (все свойства объекта), то есть каноническое десятичное представление целого числа без знака в диапазоне от 0..2 ^ 32-2 (т. Е. От «0» до «4294967294»).Предел на единицу меньше максимального значения 32-разрядного значения без знака, поскольку значение поля длины всегда всегда равно 32-разрядному целому числу без знака.

Объекты массива также наследуются от Array.prototype (но вы можете сделатьдругие объекты, которые делают это тоже, если хотите, и их внутренний класс - «Массив».

Т.е., на практике, единственная разница между массивом и простым экземпляром объекта - это"свойство магической длины".Если вам это ни для чего не нужно, просто используйте объект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...