Массивы JavaScript в выпуске IE 8 - PullRequest
1 голос
/ 14 апреля 2011

Насколько я знаю, массивы в Javascript - это не что иное, как комбинация методов и объектов.

Теперь моя задача - отобразить значения массива (скажем, y_array)

Я использовал for(x in y_array), а затем отобразил значение.

В Mozilla и в IE он работает нормально, но в IE он отображает первый элемент массива с индексом как indexOf и значением является indexOf(obj, from), котороея не хочу

Я пытался

if(x!='indexOf') {  display the array value ; }

Это работало, и все было в порядке, но было широко показано использование массивов, и я ищу какое-то постоянное исправление, а не это жестко закодированное.

Может кто-нибудь, пожалуйста, помогите мне?

Ответы [ 3 ]

10 голосов
/ 14 апреля 2011

Вы не первый, кто смешивает массивы и объекты. ТАК должен содержать FAQ для такого рода вопросов;)

Давайте попробуем объяснить:

Массив - это строка значений, которую можно получить, используя их положение в строке. Порядок значений массива является фиксированным (и может быть переупорядочен).

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

Массив выглядит так: [ 'first', 'second', 'third', ..., 'nth' ]
Объект выглядит так: { first:'firstvalue', second:'secondvalue', ..., nth:'nthvalue' }

Первый элемент массива - это элемент с индексом 0 (поэтому первая позиция в строке имеет значение индекса 0). Вы получаете его, используя myArray[0]

Объект неупорядочен, поэтому у него нет первого элемента. Вы извлекаете из него любой элемент, используя myObject.somekey или myObject['somekey'].

Для массивов вы используете цикл, проходящий по нумерованному индексу до достижения конца массива:

var i=0, len = myArray.length;
for ( i; i<len; i++ ) {
     //do something with >>> myArray[i] <<<
}

Для объектов вы используете цикл с ключом и оператором in (убедитесь, что вы получаете только определенные пользователем свойства объекта с помощью метода .hasOwnAttribute):

for ( var key in myObject ){
  if (myObject.hasOwnProperty(key)) {
     // do something with >>> myObject[key] <<<
  }
}

По сути, представьте массив как шкаф с выдвижными ящиками, каждый из которых содержит значение. Объект можно представить как груду коробок с наклейками на крышке, описывающими содержимое коробки. При извлечении чего-либо из объекта вы спрашиваете: есть ли коробка с наклейкой y в стопке x и, если да, что в ней ? Получая что-то из массива, вы спрашиваете: , пожалуйста, дайте мне содержимое ящика № х .

Теперь по вашему вопросу : массив, для которого вы получаете значения с помощью цикла for..in, содержит определенный пользователем метод, а именно indexOf. Используя для этого цикл стиля объекта, массив обрабатывается как объект, и также отображается ключ indexOf (со значением, например, function(){...}, я уверен). IE. Поэтому при переборе массивов может быть лучше использовать традиционный цикл for с числовым индексом.

Почему это только в IE ? В современных браузерах indexOf является нативным методом прототипа Array, и нативные методы не отображаются (если вы не просматриваете их прототип). IE <9 не имеет собственного метода indexOf для массивов. Где-то в сценарии, который вы используете, метод был добавлен в прототип Array как пользовательское расширение. </p>

Итог вашей проблемы: не используйте for ... in для циклического перебора значений массива.

6 голосов
/ 14 апреля 2011

Для массивов вы должны использовать это для цикла:

var y_array = [1,2,3,4];
for (var i = 0; i < y_array.length; i++) {
  var value = y_array[i];
  // do what you want
  alert(i + ': ' + value);
}

Для объектов (объекты похожи на ассоциативные массивы - свойство: значение) используйте этот цикл:

var y_array = { prop_1 : "value a", prop_2: "value_2", prop_3: 333 }
for (var key in y_array) {
   var value = y_array[key];
   // do what you want
   alert(key + ': ' + value);
}
0 голосов
/ 24 января 2014

, если в вашем объекте json нет значения, такого как jsobObj = {}. Затем вы получили функцию-прототип indexOf рядом с пустым объектом в IE <9. (со значением типа function () {...} Бьюсь об заклад). </p>

Вы можете проверить состояние в вашей петле. и пропустить этот индекс.

if (key == 'indexOf') {продолжить;}

Например:

var jsonObj = { key_1 : "value a", key_2: "value_2", key_3: 333 }
for (var key in y_array) {
if(key == 'indexOf'){continue;}           // check if the array contain indexOf 
   var value = y_array[key];
   // do what you want
   alert(key + ': ' + value);
}
...