Являются ли массивы 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