2

所以有这个功能

Array.prototype.containsCaseInsensitive = function(obj) {
  var i = this.length;
  while (i--) {
    if (this[i].toUpperCase() === obj.toUpperCase()) {
      return true;
    }
  }
  return false;
}

然后我创建这个数组:

ary = [0,1,2,3];
for (item in ary){
  console.log(ary[item])
}

输出如下:

0
1
2
3
function(obj) {
    var i = this.length;
    while (i--) {
       if (this[i].toUpperCase() === obj.toUpperCase()) {
           return true;
       }
    }
    return false;
 }

为什么函数在迭代?谢谢!

4

5 回答 5

4

for ... in ...您的属性是可枚举的(尽管无论如何您都不应该枚举数组的键)。

在 ES5 兼容的浏览器上,您可以使用以下命令安全地将该函数添加为不可枚举的属性Object.defineProperty

Object.defineProperty(Array.prototype, 'containsCaseInsensitive', {
    value: function() {
        ...
    }
});
于 2012-06-20T06:43:29.007 回答
0

当您使用for .. in数组时,它会被视为一个对象,这就是为什么它会向您显示所有属性的原因。使用正则 for 来达到你想要的效果。

于 2012-06-20T06:40:24.013 回答
0

因为containsCaseInsensitive是数组的成员,并且您正在遍历数组的所有成员。您不应该编写for ... in迭代来迭代数组中的项目。

于 2012-06-20T06:40:46.953 回答
0

因为for..in输出对象的所有可枚举属性。

如果你只想要数组的值,你可以使用:

for (item in ary){
   if ( ary.hasOwnProperty( item ) )
      console.log(ary[item])
}

在受支持的环境中,您还可以使用defineProperty将函数设置为不可枚举,如下所示:

Object.defineProperty( Array.prototype, 'containsCaseSensitive', {
    value: function( obj ) {},
    enumerable: false
    // ^ this is default when you use defineProperty, so you don't need it
    // but it is to show you how that works :-)
} );

但是,通常不建议将其for..in用于数组,您只能将其用于文字对象。

对于数组,建议使用:

for ( var i = 0, l = arr.length; i < l; i++ ) {
    console.log( arr[ i ] );
}

或者,如果支持:

arr.forEach( function( el ) {
    console.log( el );
} );
于 2012-06-20T06:41:02.583 回答
0

您正在迭代对象的所有属性。你需要看看这个

于 2012-06-20T06:41:36.423 回答