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

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

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

Ответ 1

В первых двух случаях логическое значение приводится к числу - 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. Если Тип (y) является логическим, верните результат сравнения x == ToNumber (y).

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

Ответ 2

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

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

Ответ 3

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

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

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

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

Следовательно, третий результат.


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

True имеет тип Boolean, -1, 5 и 17,000,000 имеют тип Целое.. p >

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

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

Даже следующее возвращает false, потому что "true" имеет тип Строка и true имеет тип Логический strong > :

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";


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