Javascript Arrays在IE 8中的问题

时间:2011-04-14 06:50:11

标签: javascript arrays methods internet-explorer-8 indexof

据我所知,Javascript中的数组只不过是方法和对象的组合。

现在我的任务是显示数组的值(比如y_array

我使用了for(x in y_array)然后显示了值。

在Mozilla和IE中它的工作正常,但在IE中它显示数组的第一个元素,索引为indexOf,值为indexOf(obj, from),我不想要。

我试过

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

它工作正常,但是已经广泛使用了数组,我正在寻找一些永久性修复,而不是这个硬编码。

任何人都可以帮助我吗?

3 个答案:

答案 0 :(得分:10)

您不是第一个混合数组和对象的人。 SO应包含此类问题的常见问题解答;)

让我们试着解释一下:

数组是一行值,可以使用它们在行中的位置来检索。数组值的顺序是固定的(并且可以重新排序)。

对象是一个变量,它包含键值对形式的命名属性。属于对象的键值对的顺序是任意的。

数组如下:[ 'first', 'second', 'third', ..., 'nth' ]
对象如下所示:{ first:'firstvalue', second:'secondvalue', ..., nth:'nthvalue' }

数组的第一个元素是索引为0的元素(因此行中的第一个位置的索引值为0)。您可以使用myArray[0]

检索它

对象是无序的,因此它没有第一个元素。您可以使用myObject.somekeymyObject['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] <<<
  }
}

基本上,将阵列视为带抽屉的橱柜,每个抽屉都包含一个值。一个物体可以被想象成一堆带盖上贴纸的盒子,描述盒子的内容。从一个对象中检索一些东西,你会问:在桩x中是否有一个带有贴纸y的盒子,如果有的话,它里面有什么?从数组中检索一些东西,你会问:请给我抽屉nr x 的内容。

现在关于您的问题:您使用for..in循环检索值的数组包含用户定义的方法,即indexOf。使用对象样式循环,数组被视为对象,indexOf键(我打赌的值为function(){...})也被显示出来。 IE这就是为什么在迭代数组时使用带有数字索引的传统for循环可能会更好。

为什么这只在IE 中?在现代浏览器中,indexOfArray原型的本机方法,并且未显示本机方法(除非您循环遍历其原型)。 IE&lt; 9没有用于数组的本机indexOf方法。在您使用的脚本中,该方法已作为用户定义的扩展添加到Array原型中。

问题的最后一行:不要使用for ... in循环遍历数组的值。

答案 1 :(得分:6)

对于数组,你应该使用它来循环:

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);
}

对于对象(对象就像关联数组 - property: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);
}

答案 2 :(得分:0)

如果你的json对象中没有值,比如jsobObj = {}。然后你得到了IE中的空对象的indexOf原型函数&lt; 9.(显示值类似函数(){...}我打赌)也显示出来。

你可以检查你的循环中的条件。并跳过indexOf。

if(key =='indexOf'){continue;}

例如:

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);
}