2015-02-04 3 views
1

У меня есть массив:Является ли массив в JS фактически заполнен пустым пространством или когда он напечатан, он заполнен нулями?

mydata =[]; 

я хранящее значение в массиве, используя числовой ключ, который может быть несколько большим

mydata[13525] = 1; 

Однако если я хранить только один элемент, как указано выше, когда Я печатаю массив в консоли, он печатает 13524 запятых перед объектом, тем не менее отладчик говорит мне, что имеет длину 13526 и в массиве есть только один элемент.

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

+0

Как вы напечатав массив? –

+0

console.log (mydata); – NicolasZ

ответ

1

Свойство .length массива представляет наивысший индекс плюс один в массиве, которому было присвоено значение.

Если вы не назначаете промежуточные значения (и, следовательно, имеете разреженный массив), промежуточные значения, которые вы не назначили, являются undefined, что по сути является значением «ничего здесь» в Javascript. Консоль выбирает отображение массивов, пытаясь показать вам каждое значение между 0 и концом массива, который просто не очень хороший способ отображать разреженный массив, который в основном пуст. Это скорее артефакт выбора дизайна в консоли, чем что-либо еще. Можно было бы разработать другой способ отображения содержимого массива, который по-разному обрабатывал бы разреженные массивы.

Массивы наиболее эффективны, если вы используете последовательные индексы, начиная с 0. Это то, для чего они в основном предназначены и для чего оптимизированы многие реализации, поскольку среда выполнения может делать некоторые оптимизированные вещи, если она знает, что существует последовательный набор значений.


Если вы знаете, что вы собираетесь в основном не использовать последовательности числовых индексов, начиная с 0 и как таковой .length собственности мало пользы для вас, то, возможно, простой объект с произвольными свойствами является лучшим выбор.

var mydata = {}; 
mydata[13525] = 1; 

console.log(mydata[13525]); // 1 
console.log(mydata.length); // undefined - no .length property on an object 
console.log(myData);   // {1: 13525} 
0

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

for (i = 0; i < mydata.length; i++) { 
    if(mydata[i]!= null){ 
     console.log(mydata[i]); 
    } 
} 
0

Javascript массив немного отличается от других,

var foo = [1, 2, 3, 4, 5, 6]; 
foo.length = 3; 
foo; // [1, 2, 3] 

foo.length = 6; 
foo.push(4); 
foo; // [1, 2, 3, undefined, undefined, undefined, 4] 

Хотя добытчик свойства длины просто возвращает количество элементов, которые содержатся в array, в setter, меньшее значение обрезает массив, большее значение создает разреженный массив. Угадайте, что сделает сеттер mydata[13525] = 1;.

ЦСИ: Javascript Garden


Edit:

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

mydata.forEach(function(v){console.log(v);}); 
Смежные вопросы