Почему оператор «in» в Javascript возвращает true при тестировании, если в массиве существует «0», даже если массив не содержит «0»?

Например, это возвращает true и имеет смысл:

var x = [1,2];
1 in x; // true

Это возвращает false и имеет смысл:

var x = [1,2];
3 in x; // false

Однако это возвращает истину, и я не понимаю, почему:

var x = [1,2];
0 in x;
53
Mariano Peterson 18 Июн 2010 в 07:40

6 ответов

Лучший ответ

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

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

76
Michał Perłakowski 27 Окт 2016 в 11:59

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

Например, попробуйте это:

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

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

17
Dean Harding 18 Июн 2010 в 03:44

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

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

0
LeOn - Han Li 8 Дек 2018 в 15:49

Современные браузеры, кроме 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;
    }
}
6
kennebec 18 Июн 2010 в 05:37

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

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

8
Sean 18 Июн 2010 в 03:45

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

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

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

0 in [1, 2] // true
2 in [1, 2] // false
2
Brady Huang 20 Янв 2020 в 09:42