Почему оператор «in» JavaScript возвращает true при тестировании, если 0 существует в массиве, который не содержит 0? - PullRequest
40 голосов
/ 18 июня 2010

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

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

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

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

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

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

var x = [1,2];
0 in x;

Ответы [ 5 ]

73 голосов
/ 18 июня 2010

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

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

.
17 голосов
/ 18 июня 2010

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

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

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

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

8 голосов
/ 18 июня 2010

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

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

6 голосов
/ 18 июня 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;
    }
}
0 голосов
/ 08 декабря 2018

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

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

...