Javascript Arrays在IE 8中的问题

Abh*_*hvi 1 javascript arrays methods indexof internet-explorer-8

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

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

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

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

我试过了

if(x!='indexOf') {  display the array value ; }
Run Code Online (Sandbox Code Playgroud)

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

谁能帮帮我吗?

Koo*_*Inc 10

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

让我们试着解释一下:

一个阵列是值的行,这可以使用他们的行中的位置进行检索.数组值的顺序是固定的(并且可以重新排序).

对象是包含在键-值对的形式命名属性的变量.属于对象的键值对的顺序是任意的.

数组看起来像:[ '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] <<<
}
Run Code Online (Sandbox Code Playgroud)

对于对象,使用键和in操作符使用循环(确保只使用方法检索对象的用户定义属性.hasOwnAttribute):

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

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

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

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

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


Pav*_*dek 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);
}
Run Code Online (Sandbox Code Playgroud)

对于对象(对象就像关联数组 - 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);
}
Run Code Online (Sandbox Code Playgroud)

  • @AbhishekSanghvi:@Pavel为您的问题提供了正确的解决方案(+1).不要使用`for ... in`循环数组.正如您所见,它可能会产生问题,并且还会循环遍历数组上定义的函数.阅读:https://developer.mozilla.org/en/JavaScript/Reference/Statements/for...in.只使用正常的`for`循环进行数组迭代(也就是btw.也快得多). (3认同)