Таким образом, разница между операторами == (свободное равенство) и === (строгая проверка равенства) всегда является темой обсуждения в Интернете. Давайте выясним, чем эти два отличаются.

Свободная проверка равенства или Двойное равенство (==): Оператор Двойное равенство позволяет выполнять принуждение (т. е. преобразование одного типа данных в другой) во время сравнения. Двойное равенство следует алгоритму при сравнении двух значений. Алгоритм определяется здесь https://www.ecma-international.org/ecma-262/#sec-abstract-equality-comparison.

Мы рассмотрим несколько пунктов этого алгоритма.

Пункт 1: в этом пункте говорится, что если типы двух переменных совпадают, то выполняется строгое сравнение на равенство и возвращается результат. Таким образом, если типы двух операндов одинаковы, нет никакой разницы между двойным равным и тройным равным.

Пункты 2 и 3: эти пункты указывают на тот факт, что null и undefined равны друг другу при нестрогом сравнении равенства. Эти двое могут быть принуждены друг к другу во время преобразования.

Здесь двойное равенство оказывается полезным, если вас не волнует, является ли значение нулевым или неопределенным, все, что вам нужно, это то, что значение является пустым значением.

Пункты 4 и 5: эти пункты определяют, что любой из двух операндов (переменная) является строкой. Строка будет преобразована в число с помощью метода ToNumber (), а затем будет выполнено сравнение. Двойное равенство благоприятствует числовому сравнению.

Пункты 8 и 9: эти пункты относятся к тому, если какой-либо из двух операндов является логическим, тогда логическое значение будет преобразовано в число с помощью метода ToNumber (). Логическое значение true будет преобразовано в 1, а false будет преобразовано в 0.

Пункты 10 и 11: Если какая-либо переменная является объектом, то объект сначала будет передан через метод ToPrimitive (), а затем будет выполнено сравнение.

Если оба операнда (переменная) являются объектами, то будет возвращено true, если оба объекта являются одними и теми же объектами (ссылка на один и тот же объект), в противном случае будет возвращено false.

Важные моменты:

  1. null и undefined равны друг другу.
  2. -0 и +0 равны.
  3. -Бесконечность и + бесконечность не равны друг другу.
  4. Значения NaN не равны друг другу.

Строгая проверка равенства или тройное равенство (===): тройное равенство не допускает принуждения. Он проверяет тип операндов, если два типа равны, тогда алгоритм переходит к проверке значения операндов, в противном случае он возвращает false.

null и undefined рассматриваются как два отдельных значения.

TL;DR

  1. Если типы данных задействованных значений одинаковы, будет использоваться строгое равенство.
  2. Непримитивы приводятся к примитивам, если они есть.