Podwójny operator porównania przed sprawdzeniem dwóch wartości najpierw sprawdza, czy są jednakowego typu. Jeśli są, to i tak korzysta z algorytmu, który stoi za operatorem potrójnego porównania ⇒ https://tc39.es/ecma262/#sec-abstract-equality-comparison
Jeśli natomiast porównywane wartości są innego typu, to algorytm operatora == dokonuje konwersji typów, aby wygodniej porównać wartości. To sprawia, że np. "123" == 123 zwraca true, bo algorytm konwertuje lewą stronę na typ number i finalnie porównuje 123 === 123, co już jest prawdą.
Dobrą praktyką jest używanie operatora potrójnego porównania ===, bo unika się dzięki temu różnych quirków związanych ze wspomnianą konwersją typów, która w JavaScript bywa upierdliwa. Podwójny operator można czasem spotkać jeśli chce się krótszym zapisem sprawdzić, czy wartość undefined jest równa null, bo potrójny operator zwróci tutaj false.