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 вашего браузера. (Я использовал chrome, каждый комментарий показывает оцененное значение строки перед ним.);
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 ();
Если вы хотите использовать ассоциативные массивы, вам лучше использовать простые объекты, как рекомендовали другие ответы.