Подтвердить что ты не робот

Почему оператор 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;
4b9b3361

Ответ 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.