Я понимаю, что использование «===» сравнивает тип, поэтому выполнение следующего кода приводит к «не равно», потому что он сравнивает числовой тип со строковым типом.
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?
Обновлено: Всем спасибо! Я думаю, что все отзывы прекрасны и помогли мне лучше понять это.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Оператор == сравнивает только значения переменных. Если типы разные, выполняется преобразование. Таким образом, число 20 преобразуется в строку «20» и сравнивается результат.
Оператор === сравнивает не только значения, но и типы, поэтому приведение не выполняется. В этом случае "20" !== 20
Мне было бы интересно узнать, какой из них будет изменен? То есть изменяется ли int на строку для сравнения или строка меняется на int?
Я бы предположил, что int заменяется на строку. Не всякая струна может пойти другим путем, и это, вероятно, избавит от многих проблем.
На самом деле, я только что провел дополнительное исследование и нашел нечто, называемое алгоритмом сравнения абстрактного равенства, который, если я правильно понимаю, означает, что, поскольку 20 - это число, а «20» - это строка, строка «20» преобразуется в число и два числа сравниваются.
Механизм JavaScript видит a как число и преобразует b в число перед оценкой.
Частью определения "==" является то, что значения будут преобразованы в те же типы перед сравнением, когда это возможно. Это верно для многих языков со слабой типизацией.
Насколько мне известно, JavaScript выполняет автоматическое преобразование типов данных на лету, поэтому, возможно, переменные автоматически преобразуются в эквивалентные типы.
Javascript разработан таким образом, что строка, содержащая числа, считается «равной» этому числу. Причина этого - простота использования для случая, когда пользователи вводят число в поле ввода, а сайт проверяет его в JS - вам не нужно преобразовывать введенную строку в число перед сравнением.
Это упрощает общий вариант использования, а оператор === по-прежнему позволяет вам сравнивать с рассматриваемым типом.
Когда требуется преобразование типа, JavaScript преобразует операнды String, Number, Boolean или Object следующим образом.
Проблема со сравнением == заключается в том, что JavaScript версии 1.2 не выполняет преобразование типов, тогда как версии 1.1 и 1.3 и более поздние версии делают.
Сравнение === доступно с версии 1.3 и является лучшим способом проверки совпадения двух переменных.
Если вам нужно, чтобы ваш код был совместим с версиями кода JavaScript 1.1, 1.2 и 1.3, вы должны убедиться, что все переменные совпадают, как если бы выполнялось сравнение ===.
Возможно, вам будет проще написать такой код, чтобы проверять такие вещи: alert ("20" == 20);