Почему отрицательные числа Javascript не всегда истинны или ложны?

-1 == true;        //false
-1 == false        //false
-1 ? true : false; //true

Кто-нибудь может объяснить вышеприведенный вывод? Я знаю, что могу обойти это, сравнивая с 0, но мне интересно. Я ожидал бы, что по крайней мере одно из неаккуратных операторов равенства будет истинным, поскольку они неявно преобразуют типы, и я, конечно же, не ожидал, что троичный символ даст совершенно другой результат.

3 ответа

Решение

В первых двух случаях логическое значение приводится к числу - 1 для true и 0 для false. В последнем случае это число, приведенное к логическому значению, и любое число, кроме 0 и NaN, будет приведено к значению true. Так что ваши тесты действительно больше похожи на это:

-1 == 1; // false
-1 == 0; // false
true ? true : false; // true

То же самое будет верно для любого числа, которое не равно 0 или 1.

Для более подробной информации прочитайте документацию по ECMAScript. Из 3-го издания [PDF], раздел 11.9.3 Алгоритм сравнения абстрактного равенства:

19 Если Type(y) - Boolean, вернуть результат сравнения x == ToNumber(y).

Стоит прочитать полный алгоритм, потому что другие типы могут вызвать худшие ошибки.

В большинстве систем ненулевые значения считаются истинным значением, но это не обязательно означает, что они имеют такое же истинное значение, как true, Таким образом, -1 == true не обязательно держать, но -1 все еще может считаться истинным значением, поскольку оно не равно нулю.

На самом деле, вы не должны сравнивать целые числа с логическими значениями, если вы можете избежать этого.

При оценке в качестве условия проверки целые числа, такие как -1, 5 и 17 000 000, все возвращают логическое значение true, поскольку они логически оцениваются как true, например

if(-1) {
    "This is true";
}
else {
    "This is false";
}
=> "This is true";

(Примечание: 0 логически оценивается как ложное)

С использованием "?" Оператор делает то, что делает этот код. Он передает первый аргумент как условие в операторе if, передает второй аргумент как истинный регистр и передает третий аргумент как ложный регистр.

Отсюда и третий результат.


Однако эти целые числа не относятся к тому же типу, что и истина.

True имеет тип Boolean, -1, 5 и 17 000 000 имеют тип Integer.

Сравнение "==" является строгим с точки зрения сравнения типов. Даже две вещи имеют одинаковое "значение", но не одного типа, оператор "==" возвращает false:

if(6 == true) {
    "This is true";
}
else {
    "This is false";
}
=> "This is false";

Даже следующее будет возвращать false, потому что "true" имеет тип String, а true имеет тип Boolean:

if("true" == true) {
    "This is true";
}
else {
    "This is false";
}
=> "This is false";

Отсюда и первые два результата.


Примечание. Если вы хотите сравнивать значения независимо от типа, используйте оператор "===":

if(6 === true) {
    "This is true";
}
else {
    "This is false";
}
=> "This is true";

а также,

if("true" === true) {
    "This is true";
}
else {
    "This is false";
}
=> "This is true";


Надеюсь это поможет!

Другие вопросы по тегам