Являются ли массивы Javascript редкими?

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

array[Date.getTime()] = value;

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

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

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

Ответы на вопрос(4)

поэтому вы можете использовать не только большие целые числа, но также строки, числа с плавающей запятой или другие объекты. Все ключи преобразуются в строки через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) стиль итерации, то у вас, очевидно, будут проблемы с нестандартными индексами массивов.

 Randell02 окт. 2009 г., 19:31
Ваш пример просто доказывает, что массивы JavaScriptне скудны.
 Christoph02 окт. 2009 г., 19:23
большинство реализаций JS хранят пронумерованные по индексу свойства в реальном массиве, если это возможно; тот'Однако, закулисная магия: с точки зрения языка массивы - это обычные объекты с магиейlength имущество
 user286474012 окт. 2014 г., 11:13
Это очень устарело по отношению к. фактические реализации. Большая часть оптимизации может быть выполнена (и разрешена) в спецификации ECMAScript - показанный случай просто доказывает, что такие реализации должныотступать поддерживать такие варианты использования. (Тогда я полагаю, что существует целый дополнительный вопрос о том, является ли массив разреженным, если он содержит ненулевой индекс ..)
 Juan Mendes29 янв. 2011 г., 00:51
@Mike: Вау? Объекты JS - это карты со строковыми ключами. JS вызывает toString () для всего, что вы помещаете в скобки, что 'вполне ожидаемо. Пытатьсяarr[0] = "hello"; arr["0"] = "bye"; console.log(arr[0]) и ты'получу "до свидания".
 Mike Blandford02 окт. 2009 г., 22:33
Индексы массива должны быть целыми числами. array [3.14] = pi работает, потому что Array наследует от Object. Пример: var x = []; x [.1] = 5; Тогда x имеет длину еще 0.
 Mike Blandford02 окт. 2009 г., 22:37
Вот это да. var y = {}; var x = []; х [у] = 5; Тогда х ["[Объект Object]"] 5.
 Christoph02 окт. 2009 г., 19:30
@John:length только невидим вfor..in петли, потому что он имеетDontEnum флаг установлен; в ES5 атрибут свойства называетсяenumerable и может быть явно установлен черезObject.defineProperty()
 bobince02 окт. 2009 г., 20:30
Все ключи объекта в JavaScript всегдаString; все остальное, что вы положили в индекс, получаетtoString()-ed. Объедините это с целочисленной неточностью большого числа, и это означает, что если вы установите,a[9999999999999999]=1a[10000000000000000] будет 1 (и многие другие удивительные поведения). Использование нецелых в качестве ключей очень неразумно, а произвольные объекты прямо.
 Matt02 окт. 2009 г., 19:22
Являются ли массивы обычным JS-объектом, в котором индексы / значения хранятся в нормальном режиме?свойства» механизм? Тот'То, что ваш код предлагает. Тогда я догадываюсь, что массив JS просто имеет некоторые дополнительные методы-прототипы, как обледенение на объектном торте?
 John Kugelman02 окт. 2009 г., 19:26
Существует также магия вfor...in синтаксис, который скрывает такие вещи, какlength так что вы перебираете только индексы массива, а не массивсвойства или методы. Одна общая проблема, с которой сталкиваются люди, - этоObject.prototype или жеArray.prototype который тогда ломает всеfor...in циклы, так как эти добавленные свойства / методы не скрыты.
 Crescent Fresh02 окт. 2009 г., 20:37
Тогда ты должен использовать только Строки в качестве ключей объекта, не больше, не меньше. Строка должна быть типом, который вы будете использовать, а тип ключа должен быть Строка. Целое число вы не должны использовать, не используйте также нецелые числа, за исключением того, что вы затем переходите к приведению к String. Произвольные объекты прямо.

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

 Christoph02 окт. 2009 г., 19:35
тот'с языковой точки зрения; Реализации на самом деле используют реальные массивы для хранения плотных числовых свойств
Решение Вопроса

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

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

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

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

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

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

Ваш ответ на вопрос