Przejdź do głównej zawartości

Bug #026

🪲 Znajdź buga

let firstName = new String("Brendan")
let lastName = String("Eich")
let user = { id: 1, admin: true }
let numbers = [1, 2, 3]
let nothing
let empty = null
let greet = function () { return "Hi!" }
let greeting = new greet()

console.log("object" === typeof firstName)
console.log("object" === typeof lastName)
console.log("object" === typeof user)
console.log("object" === typeof numbers)
console.log("object" === typeof empty)
console.log("object" === typeof nothing)
console.log("object" === typeof greet)
console.log("object" === typeof greeting)

Które z powyższych porównań zwrócą prawdę, a które fałsz?

Dla jakiej wartości działanie typeof zwróci błędną informację?\ (oficjalny bug JavaScript)

🧪 Rozwiązanie

let firstName = new String("Brendan")
let lastName = String("Eich")
let user = { id: 1, admin: true }
let numbers = [1, 2, 3]
let nothing
let empty = null
let greet = function () { return "Hi!" }
let greeting = new greet()

console.log("object" === typeof firstName)
console.log("object" === typeof lastName)
console.log("object" === typeof user)
console.log("object" === typeof numbers)
console.log("object" === typeof empty)
console.log("object" === typeof nothing)
console.log("object" === typeof greet)
console.log("object" === typeof greeting)

Większość wyrażeń porównania z typem object zaloguje do konsoli wartości true. Wyjątkami będą lastName, nothing, i greet.

Zmienna firstName zawiera obiekt utworzony za pomocą wywołania konstruktora String z użyciem operatora new. Powoduje to zwrócenie obiektu String który jest typem obiektu.

Zmienna lastName zawiera ciąg znaków o podstawowym typie string, stworzonego poprzez wywołanie funkcji String bez użycia operatora new, czyli bez intencji tworzenia nowego obiektu.

Zmienna user otrzymuje wartość typowego JavaScriptowego obiektu definiowanego za pomocą nawiasów klamrowych. Nie jest zaskoczeniem, że typeof zwraca dla takiej wartości object.

Zmienna numbers zawiera tablicę, czyli Array, a w JavaScript Array jest obiektem.

Zmienna nothing jest zadeklarowana bez przypisania wartości. Wywołanie jej zwraca więc wartość undefined, która jest jednocześnie typem podstawowym. typeof undefined zwraca więc undefined.

Zmienna empty zawiera wartość null. Działanie typeof dla wartości null zwróci object i jest to powszechnie uznane za błąd języka JavaScript (patrz podlinkowany artykuł The history of “typeof null”).

Bug ten celowo nie jest jednak naprawiany w działaniu języka ze względu na zachowanie kompatybilności wstecznej z wieloma istniejącymi skryptami, które polegają na tym błędnym działaniu.

Zmienna greet jest funkcją i mimo, że funkcje są też pierwszorzędnymi obiektami w JavaScript, to jednak poprzez typeof zgłaszają swój typ danych jako function.

Zmienna greeting przechowuje obiekt, utworzony poprzez użycie operatora new wywołującego funkcję greet jako konstruktora obiektu.

🎢 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