Как «20» и 20 считаются равными в JavaScript?

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

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?

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

Возможно, вам будет проще написать такой код, чтобы проверять такие вещи: alert ("20" == 20);

Rich Bradshaw 23.02.2010 00:19
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
4
1
768
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Ответ принят как подходящий

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

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

Мне было бы интересно узнать, какой из них будет изменен? То есть изменяется ли int на строку для сравнения или строка меняется на int?

Andrew Hedges 02.11.2008 20:52

Я бы предположил, что int заменяется на строку. Не всякая струна может пойти другим путем, и это, вероятно, избавит от многих проблем.

Stephen Walcher 02.11.2008 20:59

На самом деле, я только что провел дополнительное исследование и нашел нечто, называемое алгоритмом сравнения абстрактного равенства, который, если я правильно понимаю, означает, что, поскольку 20 - это число, а «20» - это строка, строка «20» преобразуется в число и два числа сравниваются.

GR1000 02.11.2008 21:30

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

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

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

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

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

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

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

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

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

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

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