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
- Equality comparisons and sameness - JavaScript | MDN
- Primitive - MDN Web Docs Glossary: Definitions of Web-related terms | MDN
- JSON.stringify() - JavaScript | MDN
❤️ Podobają Ci się bugi JS?
Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js