Operator =
jest operatorem przypisania - służy do nadania wartości zmiennej.
const x = "a"; let y = "b";
Operatory ==
i ===
służą do porównywania ze sobą dwóch wartości.
==
może przynosić nieoczekiwane rezultaty, gdyż dokonuje konwersji typów przed porównaniem.
10 == '10'; // true, because '10' (string) is coerced to a number 0 == false; // true, because false (boolean) is coerced to 0 1 == true // true, because true (boolean) is coerced to 1 "" == false // true, because "" (string) is coerced to false NaN == false // false
===
jest uważany za bezpieczniejszy operator, ponieważ NIE dokonuje konwersji przed porównaniem. Oznacza to, że poza porównaniem wartości, porównuje również jej typ.
10 === '10'; // false 0 == false; // false 1 == true // false "" == false // false NaN == false // false
Porównywanie obiektów
Porównywanie wartości prymitywnych jest proste. W przypadku obiektów sprawa wygląda nieco inaczej. W JavaScript funkcjonują referencje, czyli wirtualne sznurki łączące zmienną z jej zawartością.
Utworzony obiekt zajmuje pewne miejsce w pamięci urządzenia. Do jednego obiektu możliwe jest przypisanie dowolnej liczby referencji.
const obj = {}; const a = obj; const b = obj; const c = {}; a === b // true a === c // false b === c // false
Porównanie referencji skutkuje sprawdzeniem, czy obie wskazują na ten sam obiekt w pamięci.
Aby sprawdzić, czy obydwa obiekty są takie same, należy przeprowadzić porównanie głebokie (deep). Polega ono na sprawdzeniu, czy wszystkie wartości prymitywne składające się na dane obiekty odopowiadają sobie.
W przypadku, gdy porównywane obiekty zawierają dalsze zagnieźdżenia, warto rozważyć napisanie funkcji porównujacej wartości rekurencyjnie lub skorzystanie z instniejących bibliotek.
const obj1 = {a: {b: "ABC"}, d: 23}; const obj2 = {a: {b: "ABC"}, d: 23}; obj1.a.b === obj2.a.b && obj1.d === obj2.d // true
Wyczerpujący artykuł odnośnie porównywania głębokiego znajduje się tutaj.