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