Ответ 1
Каждый объект в JavaScript реализуется как хэш объекта, поэтому функциональной разницы нет.
Например, проверьте этот тест:
var arr = [];
arr[5] = 5;
arr['5'] = 'not 5';
console.log(arr.length, arr);
// output: 6 [undefined, undefined, undefined, undefined, undefined, "not 5"]
Числа стробируются при использовании в качестве позиций.
Подробнее см. веб-сайт Crockford. Особенно важная часть находится под заголовком "Массивы":
Arrays in JavaScript are also hashtable objects.
Производительность не является проблемой, если у вас нет тонны объектов для отслеживания (например, 500 000+), и в этом случае вы, вероятно, делаете что-то неправильно.
Есть оптимизации, которые вы можете сделать, но они действительно не имеют смысла, если вы не делаете что-то неестественное с JavaScript (например, алгоритмы сжатия... Я работал над реализацией LZMA в JS... плохая идея).
Примечание:
Если у вас есть запасной набор (например, вы определяете только 10 индексов из 10 000), вероятно, вы должны использовать обычный объект. Массивы будут инициализировать все 10 000 индексов до 'undefined', тогда как Object.keys(obj)
будет сообщать только 10, которые вы установили. Это небольшая оптимизация, которая действительно имеет смысл.