2

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;
  };
}

これは、Mozillaが推奨する実装とは異なる実装ですhttps://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/indexOf

コード:

   if (!Array.prototype.indexOf) {  
        Array.prototype.indexOf = function (searchElement /*, fromIndex */ ) {  
            "use strict";  
            if (this == null) {  
                throw new TypeError();  
            }  
            var t = Object(this);  
            var len = t.length >>> 0;  
            if (len === 0) {  
                return -1;  
            }  
            var n = 0;  
            if (arguments.length > 0) {  
                n = Number(arguments[1]);  
                if (n != n) { // shortcut for verifying if it's NaN  
                    n = 0;  
                } else if (n != 0 && n != Infinity && n != -Infinity) {  
                    n = (n > 0 || -1) * Math.floor(Math.abs(n));  
                }  
            }  
            if (n >= len) {  
                return -1;  
            }  
            var k = n >= 0 ? n : Math.max(len - Math.abs(n), 0);  
            for (; k < len; k++) {  
                if (k in t && t[k] === searchElement) {  
                    return k;  
                }  
            }  
            return -1;  
        }  
    }  

代わりにMozillaバージョンを使用する必要がありますか、それとも質問の冒頭に記載されているバージョンで十分ですか?一方を他方よりも使用することの利点はありますか?

4

2 に答える 2

2

どちらも MDN からのものですが、最初のバージョンはindexOfページの古いバージョンのものです。新しいバージョンは、実装を ECMAScript 5 仕様で公開されているアルゴリズムに合わせるための更新です。以上のことを考えると、新しいバージョンを使用するのが妥当と思われます。

変更が行われた MDN ページの差分は次のとおりです。

https://developer.mozilla.org/index.php?title=en/JavaScript/Reference/Global_Objects/Array/indexOf&action=diff&revision=32&diff=33

于 2012-06-22T16:36:54.040 に答える
2

indexOf で Mozilla バージョンを使用することをお勧めします。これは最初の実装と非常に似ていますが、より洗練されています (これは驚くべきことではありません)。たとえば、指定された配列が空であることを検出するとすぐに -1 を返し、2 番目のパラメーターとして指定されたさまざまなエッジ値を正しく処理します。

さらに良いことに、jQuery を使用している場合 (タグの選択によって暗示されているため)、その$.inArray()メソッドを使用しないのはなぜですか?

于 2012-06-22T16:22:31.893 に答える