2012-02-19 3 views
2

私はこのようなことを何度も見てきました:自分のカスタム 'array.indexOf'の中で 'i in array'を使用するのはなぜですか?

function customArrayIndexOf(item, array){ 
    for (var i = 0, l = array.length; i < l; i++) { 
     if (i in array && array[i] === item) return i; 
    } 
    return -1; 
} 

は、しかし、私はなぜi in arrayが必要とされているかわかりません。それは何をしているのです

  • は私の3つの質問がありますか?

  • 必要ですか?
  • それがなくても失敗するのはいつですか?

答えて

6

スパースアレイはチェックなしで、偽陽性を引き起こし得る:

var customArrayIndexOf = function(item, array){ 
    for (var i = 0, l = array.length; i < l; i++) { 
     if (i in array && array[i] === item) return i; 
    } 
    return -1; 
}, 
customArrayIndexOfNoCheck = function(item, array){ 
    for (var i = 0, l = array.length; i < l; i++) { 
     if (array[i] === item) return i; 
    } 
    return -1; 
}; 

var t=[]; t[1]=1; 

customArrayIndexOfNoCheck(undefined, t); // 0 
customArrayIndexOf(undefined, t); // -1 

は(ilがローカルでなければならない、すなわち、varで宣言)

+0

'Tはない[0] ==定義されていない? – mithril333221

+0

@ mithril333221、そうではありません、自分で試してみてください。 var t = []; t [1] = 1; t.indexOf(未定義);は '-1'を返します。 't [0] === undefined'は、配列に未定義のエントリがあることを意味するわけではありませんが、ネイティブルックアップ関数がその値を返したことを意味します。 – davin

+0

@ダビン私はあなたの答えを受け入れます。ただ最後のもの、なぜそれが '-1'ですか?、edit:あなたの編集はこれに答えました。それで、さらなるコメントの必要はないと思います – mithril333221

関連する問題