Подтвердить что ты не робот

Является ли true == 1 и false == 0 в JavaScript?

Я читал хорошую книгу о JavaScript.

Началось с:

Логический тип принимает только два буквальных значения: true и false. Они отличаются от числовых значений, поэтому значение true не равно 1, а false не равно 0.

Однако я наблюдал следующее:

if(1==true)
  document.write("oh!!! that true");  //**this is displayed**

Я знаю, что каждый тип JavaScript имеет логический эквивалент.

Но тогда, что правда?

4b9b3361

Ответ 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.