Как "20" и 20 считаются равными в JavaScript? - PullRequest
4 голосов
/ 02 ноября 2008

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

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?

РЕДАКТИРОВАТЬ: Спасибо всем! Я думаю, что все ответы великолепны и помогли мне понять это намного лучше.

Ответы [ 6 ]

19 голосов
/ 02 ноября 2008

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

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

3 голосов
/ 04 ноября 2008

Когда необходимо преобразование типа, JavaScript преобразует операнды типа String, Number, Boolean или Object следующим образом.

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

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

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

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

2 голосов
/ 02 ноября 2008

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

1 голос
/ 02 ноября 2008

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

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

1 голос
/ 02 ноября 2008

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

0 голосов
/ 02 ноября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...