2

IE8以前にはindexOf関数がないことを知っています。私は次のように定義しています。

if (!Array.prototype.indexOf) {
    Array.prototype.indexOf = function(obj, start) {
         for (var i = (start || 0), j = this.length; i < j; i++) {
             if (this[i] === obj) { return i; }
         }
         return -1;
    }
}

配列内の値のインデックスを正しく取得できますが、IE8 以前を使用すると、配列の末尾に関数が追加されます。したがって、私は次のようなものを得ています:

obj.obj2[0] = 'data'
obj.obj2[1] = 'other data'
obj.obj2['indexOf'] = [definition of indexOf function]

当然のことながら、これはサイトの他のすべてを壊しています。IE10 または 9 では問題は発生していません。

4

4 に答える 4

1

これはプロトタイプに追加されるため、配列をオブジェクトのように扱うたびに (for..inループは一例です)、表示されます。indexOf他のブラウザーにはデフォルトでメソッドが既にあるため、他のブラウザーには表示されません。したがって、プロトタイプを変更することはありません。

を使用obj.hasOwnProperty(propertyName)して、プロパティがオブジェクト (この場合は基本的にオブジェクトである配列) で直接定義されているか、プロトタイプ チェーンの他の場所で定義されているかをテストできます。

于 2013-07-18T08:53:56.123 に答える
0

配列を反復処理するときに何か間違ったことをしているように聞こえます。私はIE8で以下を実行しましたが、あなたが言及した動作が得られませんでした:

if (!Array.prototype.indexOf) {
    Array.prototype.indexOf = function(obj, start) {
         for (var i = (start || 0), j = this.length; i < j; i++) {
             if (this[i] === obj) { return i + " used prototype"; }
         }
         return -1;
    }
}

var myCars=new Array("Saab","Volvo","BMW");
document.write(myCars.indexOf("Volvo") + "<br/><br/>");

for (i = 0; i < myCars.length; i++)
    document.write(i + ": " + myCars[i] + "<br/>");

出力:

1 used prototype

0: Saab
1: Volvo
2: BMW
于 2013-07-17T21:08:53.323 に答える
0

Array.prototype.someFunction を使用する場合、IE 8 で本当に配列の要素をフィルタリングするには、次を使用できます。

for (var i = 0, len = myArray.length; i < len; i++) {
    if (typeof myArray[i] === "function") {break;}

    // some code for myArray trully elements
}
于 2015-04-03T13:30:55.720 に答える
-2

IE<9 には Array の関数がありません.indexOf()。正確な仕様バージョンを定義するには、使用する前にこれを実行します。

if (!Array.prototype.indexOf)
{
  Array.prototype.indexOf = function(elt /*, from*/)
  {
    var len = this.length >>> 0;

    var from = Number(arguments[1]) || 0;
    from = (from < 0)
         ? Math.ceil(from)
         : Math.floor(from);
    if (from < 0)
      from += len;

    for (; from < len; from++)
    {
      if (from in this &&
          this[from] === elt)
        return from;
    }
    return -1;
  };
}

参照

于 2013-07-18T06:25:14.383 に答える