1

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

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

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

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

我试过

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

它起作用了,一切都很好,但是显示了数组的广泛使用,我正在寻找一些永久修复而不是这个硬编码的修复。

谁能帮帮我吗?

4

3 回答 3

10

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

让我们试着解释一下:

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

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

数组看起来像:[ 'first', 'second', 'third', ..., 'nth' ]
对象看起来像:{ first:'firstvalue', second:'secondvalue', ..., nth:'nthvalue' }

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

一个对象是无序的,所以它没有第一个元素。myObject.somekey您可以使用or从中检索任何元素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] <<<
  }
}

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

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

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

您的问题的底线:不要for ... in用于循环遍历数组的值。

于 2011-04-14T08:01:51.200 回答
6

对于数组,您应该使用这个 for 循环:

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);
}
于 2011-04-14T07:02:02.480 回答
0

如果您的 json 对象中没有值,例如 jsobObj = {}。然后你在 IE < 9 中的空对象旁边得到了 indexOf 原型函数。(我敢打赌,它的值类似于 function(){...})也显示出来了。

您可以检查 for 循环中的条件。并跳过那个 indexOf。

如果(键 =='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);
}
于 2014-01-24T09:33:55.587 回答