Являются ли массивы Javascript разреженными?

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

array[Date.getTime()] = value;

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

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

Ответы

Ответ 1

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

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

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

Ответ 2

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

В общем, массивы в JavaScript разрежены, но мы можем сделать их такими же плотными, как:

запасной массив:

var a = new Array(3);
> a
[ , , ]
> a.length
3
> a[0]
undefined

Ответ 6

Вы можете использовать HTML5 localStorage или sessionStorage.

var date=Date.getTime(),value='1234567890';
date=date.toString();
localStorage.setItem(date, value);

* Объект sessionStorage равен объекту localStorage, за исключением того, что он хранит данные только для одного сеанса. Данные удаляются, когда пользователь закрывает конкретную вкладку браузера. Чтобы узнать больше, посетите w3schools.com