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すると、オブジェクトとして扱われるため、すべてのプロパティが表示されます。必要な効果を得るには、regular 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 に答える