В чем разница между == и ===?

1,00
р.
Мне кажется, что операторы == и === работают одинаково. Например:
1 == 1 // true 1 === 1 // true 1 == 2 // false 1 === 2 // false
Оператор == короче и часто встречается в других языках программирования. Так зачем === вообще?

Ответ
Операторы === и !== являются операторами строгого сравнения. Значит, если операнды имеют разные типы, то не являются равными. Например:
1 === "1" // возвращает false 1 !== "1" // возвращает true null === undefined // возвращает false
Операторы == и != являются операторами, скажем, грубого сравнения. То есть, если операнды имеют разные типы, JavaScript пытается как-то преобразовать их, чтобы стали сравнимыми. Например:
1 == "1" // возвращает true 1 != "1" // возвращает false null == undefined // возвращает true
Интересно заметить, что в отличие от ===, оператор == не является транзитивным:
"0" == 0 // true 0 == "" // true "0" == ""// false
Не очень легко помнить правила этого грубого сравнения, и иногда бывает, что оно работает неожиданным образом. Поэтому, я рекомендую использовать === вместо ==.
Даже я не помню мелкие детали оператора ==, так что посмотрим в спецификации, пункт 11.9.3:
Алгоритм сравнения абстрактного равенства Сравнение x == y, где x и y являются значениями, возвращает true или false. Это сравнение производится следующим образом: Если Type(x) такой же, что и Type(y), то Если Type(x) – Undefined, вернуть true. Если Type(x) – Null, вернуть true. Если Type(x) – Number, то Если x – NaN, вернуть false. Если y – NaN, вернуть false. Если x имеет такое же числовое значение, что и y, вернуть true. Если x равно +0 и y равно −0, вернуть true. Если x равно −0 и y равно +0, вернуть true. Вернуть false. Если Type(x) – String, то вернуть true, если x и y имеют абсолютно одинаковую последовательность символов (одинаковой длины и с одинаковыми символами в соответствующих позициях). В противном случае вернуть false. Если Type(x) – Boolean, вернуть true, если x и y оба являются или true, или false. В противном случае вернуть false. Вернуть true, если x и y относятся к одному и тому же объекту. В противном случае вернуть false. Если x равно null и y – undefined, вернуть true. Если x – undefined и y – null, вернуть true. Если Type(x) – Number и Type(y) – String, вернуть результат сравнения x == ToNumber(y). Если Type(x) – String и Type(y) – Number, вернуть результат сравнения ToNumber(x) == y. Если Type(x) – Boolean, вернуть результат сравнения ToNumber(x) == y. Если Type(y) – Boolean, вернуть результат сравнения x == ToNumber(y). Если Type(x) – либо String, либо Number, и Type(y) – Object, вернуть результат сравнения x == ToPrimitive(y). Если Type(x) – Object и Type(y) –либо String, либо Number, вернуть результат сравнения ToPrimitive(x) == y. Вернуть false.