Przejdź do głównej zawartości

Bug #012

🪲 Znajdź buga

const user1 = {
name: "John",
}
const user2 = {
name: "John",
}

console.log(user1 == user2)

Co zostanie zalogowane do konsoli z operacji porównania dwóch obiektów user1 i user2?

Czy będzie to wartość true czy false? A może jeszcze coś innego?

🧪 Rozwiązanie

const user1 = {
name: "John",
}
const user2 = {
name: "John",
}

console.log(JSON.stringify(user1) === JSON.stringify(user2))

Zacznijmy od tego, że użycie operatora == lub === nie ma tutaj żadnego znaczenia. Typ porównywanych danych jest taki sam, więc ścisłe porównanie (===) zadziałałoby identycznie jak zwykłe (==).

Jednak mimo, że wartości obiektów user1 i user2 są takie same, ich porównanie zwraca fałsz, ponieważ są to dwa różne obiekty.

W poprzednich bugach (np. #001) dowiedziałeś się, że przypisywanie obiektów do stałych/zmiennych polega na przypisaniu jedynie ich referencji tj. adresu z pamięci RAM.

Oznacza to, że porównując wartości przypisane do stałych user1 i user2, porównujemy tak naprawdę jedynie adresy w pamięci RAM, w których zapisane są te obiekty. A te w naszym przypadku są różne.

Sytuacja ma się inaczej w przypadku porównywania typów pierwotnych jak ciągi znaków (string), liczby (number), wartości logiczne (boolean).

Możemy więc użyć obejścia i za pomocą JSON.stringify() przekonwertować obiekty na ciągi znaków. Następnie możemy porównać ciągi znaków i otrzymać true, już zgodnie z naszymi oczekiwaniami.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js