Как ассоциативные массивы работают в JavaScript? - PullRequest
0 голосов
/ 13 февраля 2012

Я знаю, как их использовать, но мне интересно, как они работают под капотом, и как медленно они сравниваются с обычными массивами.

Мне кажется, что это:

myArray['value'] = 10;
myArray['another_key'] = 11;

переводится примерно так:

myArray[0][0] = 'value';
myArray[0][1] = 10;
myArray[1][0] = 'another_key';
myArray[1][1] = 11;
  • Они действительно так работают?
  • Что происходит, когда я пытаюсь получить значение из ассоциативного массива?Сколько времени нужно, чтобы получить значение из ассоциативного массива?
  • Должен ли я использовать их, если мое время обработки ограничено (например, внутри игрового цикла)?

[EDIT]

Похожемое предположение было неверным, и что ключи массива на самом деле являются свойствами объекта.Итак, чтобы собрать все ответы, которые я получил в одном месте:

  • Ассоциативные массивы - это объекты
  • Ключи - это имена свойств указанных объектов
  • Поиск не выполняется, когдавы получаете значение определенного ключа массива, потому что на самом деле вы выбираете значение свойства объекта, которое почти не занимает времени.

Ответы [ 3 ]

5 голосов
/ 13 февраля 2012

Это совершенно другое.

Во-первых, никогда не используйте массивы в качестве ассоциативных массивов.Массивы корректно работают только с числовыми признаками.Например:

var a = [];
a['foo'] = 'bar';
console.log(a.length) // prints 0

Даже объекты действительно не подходят для ассоциативных массивов, если вы считаете, что его элементы должны поддерживать определенный порядок (например, как в PHP).Это не относится к делу.Но объекты хороши для хеш-таблиц, чего в большинстве случаев достаточно.

Внутренне массивы также являются только объектами.Поэтому, когда у вас есть массив:

var a = [];
a[0] = 42;

, тогда 0 фактически преобразуется в строку и добавляется в качестве свойства к объекту (обратите внимание на последнюю строку (__proto__: Object)):

enter image description here

Вы также можете получить доступ к этому свойству с помощью a['0'].

Конечно, может быть, что эти операции оптимизированы внутри для массивов, но это зависит от двигателя.

В итоге a[0] = 42; или o['value'] = 42;o = {}) дают те же результаты

enter image description here

и доступ к ним с помощью a[0], o['value'] или o.value тоже самое.

2 голосов
/ 13 февраля 2012

Ассоциативный массив - это просто объект. Настройка элементов - это просто настройка свойств, поэтому ваш код такой же, как:

myArray.value = 10;
myArray.another_key = 11;

Поиск свойств в объекте довольно быстрый, поэтому у вас обычно не должно быть проблем с производительностью.

0 голосов
/ 13 февраля 2012

Javascript не имеет ассоциативных массивов. Вы можете использовать объекты вместо этого. http://www.quirksmode.org/js/associative.html

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