Bug #041
🪲 Znajdź buga
const str1 = "Hello World"
const str2 = `${"Hello World"}`
const str3 = String("Hello World")
const str4 = new String("Hello World")
console.log(str1 === "Hello World")
console.log(str2 === "Hello World")
console.log(str3 === "Hello World")
console.log(str4 === "Hello World")
Czy wszystkie porównania zalogują do konsoli wartość true
?
🧪 Rozwiązanie
const str1 = "Hello World"
const str2 = `${"Hello World"}`
const str3 = String("Hello World")
const str4 = new String("Hello World")
console.log(str1 === "Hello World")
console.log(str2 === "Hello World")
console.log(str3 === "Hello World")
console.log(str4.toString() === "Hello World")
W przykładzie z błędem, do konsoli zostanie zalogowana wartość false
dla ostatniego porównania z str4
.
Użycie operatora new
tworzy nową instancję obiektu. Zwracana wartość jest więc obiektem, a nie typem prymitywnym string
.
Operator new
służy do stworzenia instancji obiektu w oparciu o konstruktor. W języku JavaScript konstruktorem może być funkcja o nazwie constructor
, znajdująca się wewnątrz definicji klasy (class
), ale nie musi. Może to być też samodzielna funkcja o dowolnej nazwie.
Ścisłe porównanie obiektu z wartością prymitywną prowadzi więc do zwrócenia fałszu.
Aby w czwartym porównaniu uzyskać true
musimy na utworzonym obiekcie String
wywołać metodę toString()
, która wyciągnie z obiektu wartość prymitywną "Hello World"
typu string
.
Sytuacja z odrębnym zachowaniem się funkcji w zależności od tego czy została ona wywołana z, czy bez operatora new
wygląda podobnie również w przypadku innych funkcji, w tym tych predefiniowanych jak String
, Number
, czy Boolean
.
🎢 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