Вопрос по sparse-matrix, javascript – Являются ли массивы Javascript редкими?
То есть, если я использую текущее время в качестве индекса в массиве:
array[Date.getTime()] = value;
будет ли интерпретатор создавать экземпляры всех элементов с 0 по настоящее время? Разные браузеры делают это по-разному?
Я помню, раньше была ошибка вAIX Ядро, которое будет создавать псевдо-TTYS по запросу, но если вы сделали, скажем, "эхо> / DEV / pty10000000000" это создаст / dev / pty0, / dev / pty1, .... и затем упадет замертво. На выставках было весело, но я неЯ не хочу, чтобы это случилось с моими клиентами.
поэтому вы можете использовать не только большие целые числа, но также строки, числа с плавающей запятой или другие объекты. Все ключи преобразуются в строки через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)
стиль итерации, то у вас, очевидно, будут проблемы с нестандартными индексами массивов.
length
имущество
как именно реализованы массивы JavaScript, отличается от браузера к браузеру, но они обычно возвращаются к разреженной реализации - скорее всего, той же, что используется для доступа к свойствам обычных объектов - если использование фактического массива будет неэффективным.
Вы'Мне нужно будет попросить кого-то с большим количеством знаний о конкретных реализациях ответить на вопрос, что именно вызывает переход от плотного к разреженному, но ваш пример должен быть совершенно безопасным. Если вы хотите получить плотный массив, вам следует вызвать конструктор с явным аргументом длины и надеяться, что вы 'Я действительно получу один.
Увидетьэтот ответ для более подробного описания от olliej.
foo = new Array(10000)
, Тем не менее, это должно работать:foo = Array.apply(null, {length: 10});
а массивы - это просто специализированные объекты с автоматически поддерживаемым свойством длины (которое на самом деле больше, чем самый большой индекс,не количество определенных элементов) и некоторые дополнительные методы. Вы в безопасности в любом случае; использовать массив, если вам это нужноs дополнительные функции, и объект в противном случае.