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

person Mariano Peterson    schedule 18.06.2010    source источник


Ответы (6)


Он относится к индексу или ключу, а не к значению. 0 и 1 являются допустимыми индексами для этого массива. Также есть действительные ключи, в том числе "length" и "toString". Попробуйте 2 in x. Это будет ложно (поскольку массивы JavaScript имеют нулевой индекс).

См. документацию MDN.

person Matthew Flaschen    schedule 18.06.2010

Оператор in делает не то, что вы думаете. Оператор in возвращает true, если указанный операнд является свойством объекта. Для массивов он возвращает true, если операнд является допустимым индексом (что имеет смысл, если рассматривать массивы как объект особого случая, где свойства просто называются 0, 1, 2,...)

Например, попробуйте следующее:

var x=[1,4,6];
alert(2 in x);

Он также вернет true, потому что 2 является допустимым индексом в массиве. Точно так же 0 является индексом в массиве, поэтому также возвращает true.

person Dean Harding    schedule 18.06.2010
comment
(что имеет смысл, если думать о массивах как об объекте особого случая, в котором свойства просто называются 0, 1, 2, ...), что они и есть, согласно спецификации. Движки JavaScript оптимизируют их по возможности конечно. :-) - person T.J. Crowder; 30.04.2021

Оператор Javascript in не проверяет, содержится ли значение в массиве. Он проверяет, есть ли у объекта свойство или индекс. Итак, var x = [4,5]; 4 in x; //false 1 in x; //true.

Поскольку длина является свойством x, "length" in x; //true

person Sean    schedule 18.06.2010

Современные браузеры, кроме 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;
    }
}
person kennebec    schedule 18.06.2010
comment
Спасибо, что предоставили решение проблемы, а не просто объяснение, почему оно не работает. - person Bobort; 23.01.2017

Я предполагаю, что вы использовали Python раньше, в JS используйте Array.prototype.includes

let x = [1, 2]
x.includes(1) // true

Оператор in проверяет индексы массива, а не значение

0 in [1, 2] // true
2 in [1, 2] // false
person Brady Huang    schedule 20.11.2019

точно так же, как цикл js for in, который повторяет свойства объекта, оператор in проверяет, находится ли указанное свойство в указанном объекте или его цепочке prototype. он не проверяет, находится ли элемент в массиве.

допустим, x является массивом, используйте x.includes(element), чтобы вернуть true/false в nodejs/modern-browsers. Что касается loop, используйте for(let element of x), так как x — это js iterable.

person LeOn - Han Li    schedule 08.12.2018