Я не согласен с Кристофом, когда он заявляет, что «индексы массивов преобразуются в строки».
Во-первых, я думаю, что это зависит от реализации ... Полагаю, (хорошие) разработчики оптимизируют доступ к массиву, есть несколько умных способов сделать это.
На самом деле я провел небольшой тест, и хотя он так же хорош, как и большинство микро-тестов (т.е. не супер-надежный), он интересен:
result = ""
var x;
var trueArray = []
var startTime = new Date();
for (var i = 0; i < 100000; i++)
{
x = "i" + i; // To do the same operations
trueArray[i] = 1;
}
var endTime = new Date();
result += "With array: " + (endTime - startTime) + "\n";
var sArray = []
var startTime = new Date();
for (var i = 0; i < 100000; i++)
{
x = "" + i;
sArray[x] = 1;
}
var endTime = new Date();
result += "With s array: " + (endTime - startTime) + "\n";
var objArray = {}
var startTime = new Date();
for (var i = 0; i < 100000; i++)
{
x = "i" + i;
objArray[x] = 1;
}
var endTime = new Date();
result += "With object(i): " + (endTime - startTime) + "\n";
var sobjArray = {}
var startTime = new Date();
for (var i = 0; i < 100000; i++)
{
x = "" + i;
sobjArray[x] = 1;
}
var endTime = new Date();
result += "With s object: " + (endTime - startTime) + "\n";
var iobjArray = {}
var startTime = new Date();
for (var i = 0; i < 100000; i++)
{
x = "" + i;
iobjArray[i] = 1;
}
var endTime = new Date();
result += "With i object: " + (endTime - startTime) + "\n";
// Then display result
На IE6 я получаю: С массивом: 1453 С объектом: 3547
На FF 3.0 я получаю: с массивом: 83 с объектом: 226
В Safari 3.1 я получаю: с массивом: 140 с объектом: 313
В Opera 9.26 по какой-то причине я не получаю результат, но если я уменьшу количество циклов до десятой, я получу: С массивом: 47 С объектом: 516
На самом деле, я позволил Opera работать, пока я набираю это, и в итоге получил результат: С массивом: 281 С объектом: 166063 ...
Итак, массивы оптимизированы! Что повезло ...
Демонстрация Кристофа не впечатлила меня. Мой вывод был бы больше о том, что строки, которые могут быть интерпретированы как числа, рассматриваются как таковые, которые соответствуют приведенной формуле ...
Таким образом, моя интерпретация ваших результатов такова, что массив ведет себя как быстрый массив с числовыми индексами при подаче этих данных (возможно, с поведением ассоциативного массива на разреженных значениях, то есть некоторых изолированных больших индексах), но как объект , он все еще имеет нормальную обработку свойств. Но эти свойства не обрабатываются в части массива, поэтому результат, который вы получили с помощью join ().
[РЕДАКТИРОВАТЬ] Я добавил несколько циклов, следуя идее Кристофа.
На FF3 я получаю: С массивом: 92 С массивом s: 93 С объектом (i): 243 С объектом s: 194 С объектом i: 125 (perfs варьируются между прогонами, но примерно соответствуют).
Я не очень убежден в этом целом числе -> строка -> целое число в оба конца, даже если ECMA запрашивает эту последовательность. Я прочел это следующим образом: если свойство является строкой и может быть интерпретировано как целое число, тогда оно рассматривается как таковое.
Конечно, единственный верный способ узнать это - посмотреть на реализацию ...
Я с интересом отмечаю, что обычные объекты, получающие целочисленное свойство или свойство, которое можно преобразовать в целое число, каким-то образом оптимизируются. Возможно, потому что многие программисты JS использовали простые объекты в качестве массивов, поэтому разработчики посчитали интересным оптимизировать этот случай.