Является ли true == 1 и false == 0 в JavaScript?
Я читал хорошую книгу о JavaScript.
Началось с:
Логический тип принимает только два буквальных значения: true и false. Они отличаются от числовых значений, поэтому значение true не равно 1, а false не равно 0.
Однако я наблюдал следующее:
if(1==true)
document.write("oh!!! that true"); //**this is displayed**
Я знаю, что каждый тип JavaScript имеет логический эквивалент.
Но тогда, что правда?
Ответы
Ответ 1
Истинно, что true
и false
не представляют числовые значения в Javascript.
В некоторых языках (например, C, VB) логические значения определяются как фактические числовые значения, поэтому они являются просто разными именами для 1 и 0 (или -1 и 0).
В некоторых других языках (например, Pascal, С#) существует четкий булев тип, который не является числовым. Возможно преобразование между логическими значениями и числовыми значениями, но это происходит не автоматически.
Javascript попадает в категорию с отдельным булевым типом, но, с другой стороны, Javascript очень хочет преобразовать значения между разными типами данных.
Например, если число не является логическим, вы можете использовать числовое значение, в котором ожидается булевское значение. Использование if (1) {...}
работает так же, как и if (true) {...}
.
При сравнении значений, как в вашем примере, существует разница между оператором ==
и оператором ===
. Оператор равенства ==
счастливо преобразует типы, чтобы найти соответствие, поэтому 1 == true
оценивается как true, потому что true
преобразуется в 1
. Оператор равенства типа ===
не выполняет преобразования типов, поэтому 1 === true
вычисляет значение false, поскольку значения имеют разные типы.
Ответ 2
В JavaScript == произносится как "Вероятно равный".
Я имею в виду, что JavaScript автоматически преобразует логическое значение в целое число, а затем попытается сравнить обе стороны.
Для действительного равенства используйте оператор ===.
Ответ 3
Попробуйте строгое сравнение равенства:
if(1 === true)
document.write("oh!!! that true"); //**this is not displayed**
Оператор ==
выполняет преобразование из одного типа в другой, оператор ===
этого не делает.
Ответ 4
Из спецификации ECMAScript, раздел 11.9.3 Алгоритм сравнения абстрактного равенства:
Сравнение x == y, где x и y - значения, выдает true или ложный. Такое сравнение выполняется следующим образом:
- Если тип (y) булев, верните результат сравнения x == ToNumber (y).
Таким образом, in, if (1 == true)
, true
принуждается к Number
, т.е. Number(true)
, что приводит к значению 1
, что дает окончательный if (1 == 1)
, который равен true
.
if (0 == false)
- та же самая логика, поскольку Number(false) == 0
.
Это не происходит, если вместо оператора ===
использовать оператор строгого равенства:
11.9.6 Алгоритм сравнения строгих равенств
Сравнение x === y, где x и y - значения, выражает true или ложный. Такое сравнение выполняется следующим образом:
- Если тип (x) отличается от типа (y), верните false.
Ответ 5
А, страшный оператор сравнения сравняется снова. Никогда не используйте его. Всегда используйте строгое сравнение, === или! == вместо.
Бонусный факт: 0 == ''
Ответ 6
Фактически, каждый объект в javascript разрешает true, если он имеет "реальную ценность", как это делает W3Cschools. Это означает все, кроме ""
, NaN
, undefined
, null
или 0
.
Тестирование числа с булевым с помощью оператора ==
действительно немного странно, поскольку логическое преобразование преобразуется в числовое значение 1 перед сравнением, что немного мешает логике определения.
Это становится еще более запутанным, когда вы делаете что-то вроде этого:
var fred = !!3; // will set fred to true
var joe = !!0; // will set joe to false
alert("fred = "+ fred + ", joe = "+ joe);
Ответ 7
Используйте ===
, чтобы приравнивать переменные вместо ==
.
==
проверяет, похоже ли значение переменных
===
проверяет, похоже ли значение переменных и тип переменных
Обратите внимание, как
if(0===false) {
document.write("oh!!! that true");
}
и
if(0==false) {
document.write("oh!!! that true");
}
дают разные результаты
Ответ 8
с == вы по существу сравниваете, является ли переменная ложной при сравнении с ложным или truthey при сравнении с true. Если вы используете ===, он будет сравнивать точное значение переменных, поэтому true не будет === 1
Ответ 9
Это работает и наоборот. Если вы пишете:
alert(Math.pow((7>3),2));
вы получите значение 1 (или 1 квадрат), так как оно преобразует условное прямо к значению 1.