Почему делает JavaScript “в” операторе, возвращают true при тестировании, если 0 существует в массиве, который не содержит 0?

Как указано на этой странице: https://developer.android.com/about/versions/oreo/background

Пределы фонового выполнения Android O по умолчанию не применяются к приложение, которое нацелено на SDK ниже 26, однако пользователь может вручную наложить эти ограничения на старые приложения, перейдя в настройки.

Как указано "Примечание. По умолчанию эти ограничения применяются только к приложениям, ориентированным на Android 8.0 (уровень API 26) или выше. Однако пользователи могут включить большинство этих ограничений для любого приложения на экране" Настройки ", даже если приложение целевой уровень API ниже 26 ".

43
задан Michał Perłakowski 27 October 2016 в 11:58
поделиться

5 ответов

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

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

76
ответ дан 26 November 2019 в 22:39
поделиться

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

let x = [1, 2]
x.includes(1) // true
0
ответ дан 26 November 2019 в 22:39
поделиться

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

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

8
ответ дан 26 November 2019 в 22:39
поделиться

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

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

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

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

17
ответ дан 26 November 2019 в 22:39
поделиться

Современные браузеры, за исключением 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
ответ дан 26 November 2019 в 22:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: