почему отрицательные числа Javascript не всегда являются истинными или ложными? - PullRequest
44 голосов
/ 01 сентября 2010
-1 == true;        //false
-1 == false        //false
-1 ? true : false; //true

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

Ответы [ 3 ]

58 голосов
/ 01 сентября 2010

В первых двух случаях логическое значение приводится к числу - 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).

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

1 голос
/ 01 сентября 2010

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

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

0 голосов
/ 21 апреля 2016

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

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

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

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

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


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

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


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

...