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