Przejdź do głównej zawartości

Bug #075

🪲 Znajdź buga

const sentence = new String("Lorem ipsum dolor")

console.log(sentence instanceof String)
console.log(!sentence instanceof Number)

Chcemy sprawdzić czy obiekt jest lub nie jest instancją danej klasy.

Co zostanie zalogowane do konsoli w powyższym przykładzie?

🧪 Rozwiązanie

const sentence = new String("Lorem ipsum dolor")

console.log(sentence instanceof String)
console.log(!(sentence instanceof Number))

sentence instanceof String zwróci prawdę.

Ciąg znaków został stworzony za pomocą konstruktora klasy String.

Zwróć uwagę na użycie operatora new. Bez niego ciąg znaków zostałby utworzony za pomocą funkcji String nie będącej konstruktorem klasy, więc instanceof zwróciłby w takiej sytuacji fałsz (ciąg znaków byłby wtedy typem prymitywnym, a nie obiektem).

!sentence instanceof Number zwróci fałsz.

I tutaj mamy naszego buga.

W intencji mamy zanegowanie wyniku działania operatora instanceof.

W rzeczywistości negujemy jednak wartość ze stałej sentence.

Ponieważ typ danych w sentence jest obiektem, zostaje on skonwertowany poprzez działanie operatora negacji najpierw do wartości logicznej true, a następnie odwrócony do wartości false.

Wartość false z pewnością nie jest instancją klasy Number, więc finalnie do konsoli zostaje zalogowana wartość false.

Jeśli zależy nam na sprawdzeniu czy dany obiekt nie jest instancją danej klasy, musimy całą operację sprawdzania instancji umieścić wewnątrz nawiasów i zanegować dopiero efekt takiego sprawdzenia.

sentence instanceof Number zwróci true.\ !(sentence instanceof Number) zwróci false.

Innym sposobem mogłoby być użycie operatora porównania\ sentence instanceof Number === false.

🎢 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