Почему оператор javascript "in" возвращает true при тестировании, если 0 существует в массиве, который не содержит 0?
Почему оператор "in" в Javascript возвращает true при тестировании, если "0" существует в массиве, даже если массив не содержит "0"?
Например, это возвращает true и имеет смысл:
var x = [1,2];
1 in x; // true
Это возвращает false и имеет смысл:
var x = [1,2];
3 in x; // false
Однако это возвращает true, и я не понимаю, почему:
var x = [1,2];
0 in x;
Ответы
Ответ 1
Это относится к индексу или ключу, а не к значению. 0
и 1
являются допустимыми индексами для этого массива. Существуют также действующие ключи, включая "length"
и "toSource"
. Попробуйте 2 in x
. Это будет ложно (поскольку JavaScript-массивы индексируются 0).
См. документацию
Ответ 2
Оператор in
не делает то, что вы думаете. Оператор in
возвращает true
, если указанный операнд является свойством объекта. Для массивов он возвращает true
, если операнд является допустимым индексом (что имеет смысл, если рассматривать массивы как объект специального случая, где свойства просто называются 0, 1, 2,...)
Например, попробуйте следующее:
javascript:var x=[1,4,6]; alert(2 in x);
Он также вернет true
, потому что "2" является допустимым индексом в массиве. Точно так же "0" является индексом в массиве, поэтому также возвращает true
.
Ответ 3
Оператор Javascript in
не проверяет, содержится ли значение в массиве. Он проверяет, имеет ли объект свойство или индекс. Итак var x = [4,5]; 4 in x; //false 1 in x; //true
.
Поскольку длина является свойством x, "length" in x; //true
Ответ 4
Современные браузеры, кроме IE, поддерживают пару методов, которые могут найти значение
в массиве.
indexOf и lastIndexOf возвращают первый (или последний) индекс точного соответствия
их аргумента в массиве или -1, если не найден соответствующий элемент.
if(A.indexOf(0)!= -1){
// the array contains an element with the value 0.
}
Вы можете добавить один или оба метода в IE и более старые браузеры -
if(![].indexOf){
Array.prototype.indexOf= function(what, i){
i= i || 0;
var L= this.length;
while(i< L){
if(this[i]=== what) return i;
++i;
}
return -1;
}
Array.prototype.lastIndexOf= function(what, i){
var L= this.length;
i= i || L-1;
if(isNaN(i) || i>= L) i= L-1;
else if(i< 0) i += L;
while(i> -1){
if(this[i]=== what) return i;
--i;
}
return -1;
}
}
Ответ 5
точно так же, как js for in
цикла for in
который повторяет свойства объекта, оператор in
проверяет, находится ли указанное свойство в указанном объекте или в его цепочке прототипов. он не проверяет, находится ли элемент в массиве.
допустим, x является массивом, используйте x.includes(element)
для возврата true/false
в nodejs/modern-browser. Что касается loop
, используйте for(let element of x)
так как x является iterable
js.