Вопрос по sparse-matrix, javascript – Являются ли массивы Javascript редкими?

89

То есть, если я использую текущее время в качестве индекса в массиве:

array[Date.getTime()] = value;

будет ли интерпретатор создавать экземпляры всех элементов с 0 по настоящее время? Разные браузеры делают это по-разному?

Я помню, раньше была ошибка вAIX Ядро, которое будет создавать псевдо-TTYS по запросу, но если вы сделали, скажем, "эхо> / DEV / pty10000000000" это создаст / dev / pty0, / dev / pty1, .... и затем упадет замертво. На выставках было весело, но я неЯ не хочу, чтобы это случилось с моими клиентами.

Отладка теперь в порядке в Chrome - здесьПример вывода на консоль: [пусто × 9564, Объект, пусто × 105, Объект, пусто × 10, Объект, пустой × 12, Объект, пустой × 9, Объект, пустой × 21, Объект, пусто × 9, Объект] jsalvata
Возможным недостатком этого является сложность отладки в Firebug. оператор log в массиве будет перечислять только первые 1000 элементов в массиве, которые все будут "не определено», Кроме того, array.length скажет вам, что в вашем массиве есть n элементов, хотя n-1 просто "призрак» неопределенные значения. Michael Butler

Ваш Ответ

4   ответа
62

поэтому вы можете использовать не только большие целые числа, но также строки, числа с плавающей запятой или другие объекты. Все ключи преобразуются в строки черезtoString() перед добавлением в хеш. Вы можете подтвердить это с помощью некоторого тестового кода:

<script>
  var array = [];
  array[0] = "zero";
  array[new Date().getTime()] = "now";
  array[3.14] = "pi";

  for (var i in array) {
      alert("array["+i+"] = " + array[i] + ", typeof("+i+") == " + typeof(i));
  }
</script>

Вывод:

array[0] = zero, typeof(0) == string
array[1254503972355] = now, typeof(1254503972355) == string
array[3.14] = pi, typeof(3.14) == string

Обратите внимание, как я использовалfor...in синтаксис, который дает только те индексы, которые на самом деле определены. Если вы используете более распространенныйfor (var i = 0; i < array.length; ++i) стиль итерации, то у вас, очевидно, будут проблемы с нестандартными индексами массивов.

Являются ли массивы обычным JS-объектом, в котором индексы / значения хранятся в нормальном режиме?свойства» механизм? Тот'То, что ваш код предлагает. Тогда я догадываюсь, что массив JS просто имеет некоторые дополнительные методы-прототипы, как обледенение на объектном торте? Matt
Это очень устарело по отношению к. фактические реализации. Большая часть оптимизации может быть выполнена (и разрешена) в спецификации ECMAScript - показанный случай просто доказывает, что такие реализации должныотступать поддерживать такие варианты использования. (Тогда я полагаю, что существует целый дополнительный вопрос о том, является ли массив разреженным, если он содержит ненулевой индекс ..) user2864740
Индексы массива должны быть целыми числами. array [3.14] = pi работает, потому что Array наследует от Object. Пример: var x = []; x [.1] = 5; Тогда x имеет длину еще 0. Mike Blandford
большинство реализаций JS хранят пронумерованные по индексу свойства в реальном массиве, если это возможно; тот'Однако, закулисная магия: с точки зрения языка массивы - это обычные объекты с магиейlength имущество Christoph
36

как именно реализованы массивы JavaScript, отличается от браузера к браузеру, но они обычно возвращаются к разреженной реализации - скорее всего, той же, что используется для доступа к свойствам обычных объектов - если использование фактического массива будет неэффективным.

Вы'Мне нужно будет попросить кого-то с большим количеством знаний о конкретных реализациях ответить на вопрос, что именно вызывает переход от плотного к разреженному, но ваш пример должен быть совершенно безопасным. Если вы хотите получить плотный массив, вам следует вызвать конструктор с явным аргументом длины и надеяться, что вы 'Я действительно получу один.

Увидетьэтот ответ для более подробного описания от olliej.

Я нене думаю, что вы на самом деле получите плотный массив, если вы скажете что-то вродеfoo = new Array(10000), Тем не менее, это должно работать:foo = Array.apply(null, {length: 10}); doubleOrt
7

а массивы - это просто специализированные объекты с автоматически поддерживаемым свойством длины (которое на самом деле больше, чем самый большой индекс,не количество определенных элементов) и некоторые дополнительные методы. Вы в безопасности в любом случае; использовать массив, если вам это нужноs дополнительные функции, и объект в противном случае.

тот'с языковой точки зрения; Реализации на самом деле используют реальные массивы для хранения плотных числовых свойств Christoph
9

используя синтаксис JavaScript, разработанный для такого рода вещей. Вы можете рассматривать это как словарь, но "для ... в ... " синтаксис позволит вам схватить их всех.

var sparse = {}; // not []
sparse["whatever"] = "something";

Похожие вопросы