Массив Javascript содержит только неопределенные после инициализации, а не заданные значения - PullRequest
6 голосов
/ 18 марта 2011

Я думал, что знаю, как объявлять массивы javascript, но в этом сценарии я получаю бесконечный цикл из undefined элементов в массиве.

Я объявляю три массива чисел, два из которых имеют несколько значений, а другой - одно значение.

У меня есть оператор switch, который назначает один из трех массивов новому имени переменной cluster_array

Когда я запускаю цикл for через cluster_array, я получаю бесконечный цикл и каждый элемент, если undefined

Чего мне не хватает?

<script type="text/javascript">
    var ga_west_cluster = new Array(10,11,12,14,74,75,76,77,78,79,80,81,82,83,85,86,87,88,89,90,91,92,295,296);

// original bad array
    var ga_east_cluster = new Array(84);
// added an extra (dummy) value and it works fine   
    var ga_east_cluster = new Array(1,84);
    var sc_cluster      = new Array(93,94,95,96,97,98,99,100,101,102,103);
</script>

Вот текст alert:

var test_message        = "cluster data\n";
    for(var k=0;k<cluster_array.length;k++)
        test_message    += "value: "+cluster_array[k]+"\n";

test alert box

1 Ответ

14 голосов
/ 18 марта 2011

Не инициализируйте подобные массивы. Всегда делайте это вместо:

var myarray = [value, value, value, ... ];

Конструктор Array () ужасно спроектирован. Форма с одним аргументом, когда аргумент является числом, интерпретируется как запрос на «инициализацию» массива с таким количеством «пустых» значений. Это бессмысленная вещь, поэтому в целом вам гораздо лучше использовать константу массива (как в моем примере выше).

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

...