Вопрос

Я понимаю, что использование "===" сравнивает тип, поэтому выполнение следующего кода приводит к "не равно", потому что он сравнивает числовой тип со строковым типом.

var a = 20;
var b = "20";
    if (a === b) {
        alert("They are equal");
    } else {
        alert("They are not equal");
}

Но я не понимаю, как использование "==" для сравнения только значений приводит к сообщению "Они равны".

var a = 20;
var b = "20";
    if (a == b) {
        alert("They are equal");
    } else {
        alert("They are not equal");
}

Насколько эти значения равны?Разве строка "20" не хранится как символы ASCII 50 и 48 (0110010 и 0110000 в двоичном формате), а 20 не хранится как фактическое двоичное число 0010100?

Редактировать:Спасибо всем!Я думаю, что все ответы замечательные и помогли мне понять это намного лучше.

Это было полезно?

Решение

Оператор == сравнивает только значения переменных. Если типы разные, выполняется преобразование. Таким образом, число 20 преобразуется в строку «20» и результат сравнивается.

Оператор === сравнивает не только значения, но и типы, поэтому приведение не выполняется. В этом случае " 20 " ! == 20

Другие советы

Когда требуется преобразование типов, JavaScript преобразует строковые, Числовые, логические или объектные операнды следующим образом.

  • При сравнении числа и строки строка преобразуется в числовое значение.JavaScript пытается преобразовать строковый числовой литерал в значение числового типа.Во-первых, математическое значение выводится из строкового числового литерала.Далее это значение округляется до ближайшего значения числового типа.
  • Если один из операндов является логическим, логический операнд преобразуется в 1, если он равен true, и +0, если он равен false.
  • Если объект сравнивается с числом или строкой, JavaScript пытается вернуть значение по умолчанию для объекта.Операторы пытаются преобразовать объект в примитивное значение, строку или Числовое значение, используя методы valueOf и toString объектов.Если эта попытка преобразовать объект завершается неудачей, генерируется ошибка времени выполнения.

Проблема со сравнением == заключается в том, что JavaScript версии 1.2 не выполняет преобразование типов, в то время как версии 1.1 и 1.3 и далее выполняют.

Сравнение === доступно с версии 1.3 и является лучшим способом проверки соответствия двух переменных.

Если вам нужно, чтобы ваш код был совместим с версиями кода JavaScript версий 1.1, 1.2 и 1.3, вы должны убедиться, что все переменные совпадают, как если бы выполнялось сравнение ===.

Механизм JavaScript видит a как число и преобразует b в число перед оценкой.

Часть определения " == " является то, что значения будут преобразованы в те же типы перед сравнением, когда это возможно. Это верно для многих слабо типизированных языков.

Javascript разработан так, что строка, содержащая числа, считается "равной" на этот номер. Причиной этого является простота использования для случая, когда пользователи вводят число в поле ввода и сайт проверяет его в JS - вам не нужно приводить введенную строку к числу перед сравнением.

Это упрощает общий вариант использования, и оператор === по-прежнему позволяет сравнивать с рассматриваемым типом.

Насколько я знаю, JavaScript выполняет автоматическое преобразование типов данных на лету, поэтому, возможно, переменные автоматически приводятся к эквивалентным типам.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top