TLDR; 私が思いつくことができる最善の方法はこれです:(ユースケースに応じて、この関数を最適化する方法はいくつかあります。)
function arrayIndexExists(array, index){
if ( typeof index !== 'number' && index === parseInt(index).toString()) {
index = parseInt(index);
} else {
return false;//to avoid checking typeof again
}
return typeof index === 'number' && index % 1===0 && index >= 0 && array.hasOwnKey(index);
}
他の回答の例は近づき、いくつかの(おそらくほとんどの)目的で機能しますが、以下で説明する理由により、技術的にはかなり正しくありません。
Javascript配列は、「数値」キーのみを使用します。配列に「連想キー」を設定すると、実際には、その配列の要素ではなく、その配列オブジェクトにプロパティが設定されます。たとえば、これは、Array.forEach()を使用するときに「連想キー」が繰り返されず、Array.lengthの計算時に含まれないことを意味します。(これの例外は、「0」のような文字列は配列の要素に解決されますが、「0」のような文字列は解決されません。)
さらに、存在しない配列要素またはオブジェクトプロパティをチェックしても、未定義と評価されますが、実際には、配列要素またはオブジェクトプロパティがまだ設定されていないことはわかりません。たとえば、undefinedは、returnステートメントで終了しない関数を呼び出した結果でもあります。これにより、奇妙なエラーが発生し、コードのデバッグが困難になる可能性があります。
これは混乱を招く可能性がありますが、ブラウザのjavascriptコンソールを使用して非常に簡単に調べることができます。(私はクロムを使用しました。各コメントはその前の行の評価値を示しています。);
var foo = new Array();
foo;
//[]
foo.length;
//0
foo['bar'] = 'bar';
//"bar"
foo;
//[]
foo.length;
//0
foo.bar;
//"bar"
これは、連想キーが配列内の要素にアクセスするためではなく、オブジェクトのプロパティに使用されることを示しています。
foo[0] = 0;
//0
foo;
//[0]
foo.length;
//1
foo[2] = undefined
//undefined
typeof foo[2]
//"undefined"
foo.length
//3
これは、typeofをチェックしても、要素が設定されているかどうかを確認できないことを示しています。
var foo = new Array();
//undefined
foo;
//[]
foo[0] = 0;
//0
foo['0']
//0
foo[' 0']
//undefined
これは、前述の例外と、parseInt()を使用できない理由を示しています。
連想配列を使用する場合は、他の回答で推奨されているように、単純なオブジェクトを使用することをお勧めします。