В JavaScript массивы являются только объекты с некоторыми специальными свойствами, такими как автоматический length
собственности, а также некоторые методы прикреплены (например, sort
, pop
, join
и т.д.). Действительно, a
не будет учитываться в вашем массиве, поскольку свойство length
массива хранит только количество элементов с именем свойства, которое может быть представлено с 32-битовым положительным целым числом.
И поскольку массивы всегда автоматически определяют каждый пронумерованный элемент до самого высокого элемента с положительным 32-битным именем INT собственности, это эффективно означает length
собственность магазинов -выше, чем элемент с самым высоким 32-разрядным целым числом в виде название свойства. Спасибо @Felix Kling за исправление меня об этом в комментариях.
Добавление свойств, таких как a
, не запрещено вообще, но вы должны следить за ними, так как это может сбивать с толку при чтении кода.
Там также разница в ходьбе по элементам массива:
пройти через все пронумерованные элементы:
for (var i=0; i<myArray.length; i++) {
//do something
}
пройти через каждое свойство, не встроенное:
for (var i in myArray) {
//do something
}
Обратите внимание, что этот цикл также включает в себя все, что включено из Array.prototype
, что не является встроенным методом. Итак, если вы должны добавить Array.prototype.sum = function() {/*...*/};
, он также будет зациклен.
Чтобы узнать, если объект вы используете действительно массив, а не только объект, можно выполнить следующий тест:
if (Object.prototype.toString.call(myObject) === '[object Array]') {
//myObject is an array
} else if (typeof myObject === 'object') {
//myObject is some other kind of object
}
См @artem's comment: myObject instanceof Array
не всегда может работать правильно.
Neato. Даже не знал, что это возможно. Имеет смысл, хотя массив является всего лишь объектом. – iambriansreed