Сравнение абстрактного равенства и строгого равенства

Если вы работали с языками программирования, вы знаете, что во всех языках программирования есть оператор сравнения, то есть ==, который используется для сравнения двух значений. Но JS сделал еще один шаг вперед. В JS также есть оператор ===, известный как сравнение строгого равенства.

Если вы поищите разницу между == и === в JS в Интернете, во всех статьях будет утверждаться:

«==» проверяет значения, тогда как «===» проверяет оба значения и типы обоих значений.

И вы совершенно НЕПРАВЫ!

Прежде чем сделать собственный вывод, давайте сначала посмотрим, что говорит официальная документация JavaScript! Если вы проверите официальную документацию ECMAScript в пункте 7.2.14, там написано:

Сама первая строка говорит, что == проверяем типы «x» и «y»; если оба типа одинаковы, то он вызовет === внутри! Теперь давайте посмотрим документацию === ниже.

Здесь вы можете видеть, что === также проверяет, равны ли оба типа. Если типы «x» и «y» не совпадают, он сразу выдаст false, даже не проверяя значения.

Так что же здесь происходит? Давайте просто это!

Если вы используете == (например: x == y), сначала проверяются типы x и y, а затем:

  • Если типы обоих операндов одинаковы, он вызывает === для выполнения дальнейшей операции.
  • Если типы не равны, будет выполнено преобразование типов (также известное как приведение в JavaScript). После этого он вернет true или false путем сравнения значений.

Если вы используете === (например: x === y), сначала проверяются типы x и y, а затем:

  • Если оба типа операндов не равны, он просто вернет false.
  • Если оба типа операндов равны, он может просто проверить значение и вернуть true или false.

Так в чем же на самом деле разница между == и ===?

== и === оба проверяют типы, просто == выполняет приведение (преобразование типа), тогда как === этого не делает.

Если присмотреться, становится понятно, почему создатель JavaScript сделал это. Когда вы используете == для двух разных типов операндов, например, «14» == 14, который возвращает true, JS необходимо преобразовать «14» в 14, и для этого JS необходимо сначала проверьте типы обоих операндов. Без проверки типов JS не может просто преобразовывать типы случайным образом.

Вот почему программирование на JS иногда кажется странным! В документации по JavaScript есть еще пасхалки 🫣. До скорой встречи в следующей статье.