Przejdź do głównej zawartości

Bug #088

🪲 Znajdź buga

const date_1999 = new Date("1999-01-01")
const date_1999_ = new Date("1999-01-01")
const date_2000 = new Date("2000-01-01")
const date_2001 = new Date("2001-01-01")

console.log(date_1999 < date_2000)
console.log(date_1999_ < date_2001)
console.log(date_1999 < date_1999)
console.log(date_1999 < date_1999_)
console.log(date_1999 == date_1999)
console.log(date_1999 == date_1999_)
console.log(date_1999 <= date_1999_)

Jakie wartości zostaną zalogowane do konsoli?

🧪 Rozwiązanie

const date_1999 = new Date("1999-01-01")
const date_1999_ = new Date("1999-01-01")
const date_2000 = new Date("2000-01-01")
const date_2001 = new Date("2001-01-01")

console.log(date_1999 < date_2000) // true
console.log(date_1999_ < date_2001) // true
console.log(date_1999 < date_1999) // false
console.log(date_1999 < date_1999_) // false
console.log(date_1999 == date_1999) // true
console.log(date_1999 == date_1999_) // false
console.log(date_1999 <= date_1999_) // true

Daty przypisane do stałych date_1999 i date_1999_ są takie same.

Są jednak różnymi obiektami i porównywanie ich za pomocą operatora == lub === zawsze zwróci fałsz.

Prawda z takiego porównania zostanie zwrócona tylko wtedy, gdy porównywany ze sobą będzie ten sam referencyjny obiekt.

Moglibyśmy stworzyć alias np. const date_1999_x = date_1999.

Wtedy porównanie date_1999_x == date_1999 zwróciłoby prawdę.

Wiązałoby się to jednak też i z innymi implikacjami jakie niosą za sobą aliasy obiektów w JavaScript.

Mutując taki alias lub referencyjny obiekt, zmieniałby się on jednocześnie w obu stałych/zmiennych.

Operator <, ale również i <= oraz ich odwrotności > i >=, działają na podstawie innego algorytmu niż ==

Porównywane są tutaj wartości liczbowe, do których zostaną sprowadzone operandy (w naszym przypadku obiekty dat).

Nie ma znaczenia czy wartości są przekazywane jako referencja.

Jeśli chcemy więc porównać dwie daty pod kątem, która data jest wcześniejsza (mniejsza) lub późniejsza (większa), to używanie operatorów <, <=, >, >= nadaje się bardzo dobrze.

Jeśli chcemy jednak dowiedzieć się, czy dwie daty są identyczne, musimy najpierw samodzielnie sprowadzić je do wartości liczbowych np. metodą getTime().

Dopiero tak zaprezentowane daty w postaci wartości liczbowych możemy porównywać za pomocą == lub ===.

🎢 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