Javascript большой доступ к свойствам доступа к свойствам

Каковы характеристики производительности доступа к свойствам JavaScript (по текущим реализациям)?

  • Можно ли считать, что доступ к массиву равен O (1)?
  • Если я использую объект в качестве хеш-таблицы (со строковыми ключами), могу ли я безопасно предположить время доступа O (1) или O (log n)?

  • Существуют ли общие браузеры или среды, которые значительно быстрее/медленнее, чем другие, и что я должен следить за ними?

  • Можно ли что-нибудь сказать в стандартах JavaScript?

И самое главное:

  • Где можно найти хорошие ссылки для таких проблем с асимптотической ошибкой JavaScript?

Ответы

Ответ 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, которые вы установили. Это небольшая оптимизация, которая действительно имеет смысл.