Почему отрицательные числа 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";
Надеюсь, это поможет!