9.2.2022 |

JavaScript is weird

Array gleich !Array?

[] == ![] // -> ?

a) false
b) true

Antwort

Antwort: b) true

Arrays sind in JavaScript "truthy", sodass ![] zu false wird. Und wiederum zu einer 0 beim Vergleich. [] wird direkt zu einer Number gecastet. Leere Arrays werden in JavaScript zu einer 0 gecastet, sodass am Ende 0 == 0 geprüft wird.

Ist NaN gleich NaN?

Object.is(NaN, NaN) // -> ?
NaN === NaN // -> ?

a) true, true
b) false, false
c) true, false
d) false, true

Antwort

Antwort: c) true, false

NaN und NaN haben das gleiche Value, weshalb Object.is(NaN, NaN) -> true zurückliefert. Beim strict equal (===) wird allerdings immer false zurückgegeben, wenn einer der Werte NaN ist.

parseInt ... Hä?

parseInt("Infinity") // -> ?
Antwort

Antwort: NaN

parseInt("Infinity", 19)
Antwort

Antwort: 18

Erklärung: der 2. Parameter bei parseInt gibt das Zahlensystem an, in dem geparsed werden soll. Hier base-19. parseInt parsed immer so lange, bis es kein passendes Zeichen mehr findet. I entspricht in base-19 der 18 und ist damit ein parse-barer Wert.

parseInt(null, 24)
Antwort

Antwort: 23

Erklärung: parseInt konvertiert den Input immer erst zu einem String und macht daher aus null -> "null". N entspricht in base-24 der 23.

.........

[...[..."..."]].length // -> ?
Antwort

Antwort: 3

Erklärung: Der Spread-Operator ... nutzt die @@iterator Funktion. Bei einem String gibt die iterator Methode ein Array mit den einzelnen Chars zurück.

[..."..."] // -> [".",".","."]
[...[".",".","."]] // -> [".",".","."]

null mit 0 vergleichen

null < 0  // -> ?
null == 0 // -> ?
null <= 0 // -> ?
Antwort
null < 0  // -> false
null == 0 // -> false
null <= 0 // -> true

Erklärung:

  1. 6.1.6.1.12 Number::lessThan
    TLDR: beide Seiten werden über einen Algorithmus auf Zahlen gecastet und verglichen
    +0 < 0 // -> false Aber auch +0 > 0 // -> false
  2. 6.1.6.1.13 Number::equal
    TLDR: Algorithmus hat hierfür keinen speziellen Fall, daher default: false
  3. JavaScript schaut hier nur auf das Gegenteil null > 0. Da greaterThan genauso definiert ist wie lessThan liefert null > 0 -> false. Das heißt für JavaScript (null <= 0) = !(null > 0) -> true

Detaillierter Artikel, der das Verhalten im Detail erklärt: Javascript : The Curious Case of Null >= 0

Quelle: What the f*ck JavaScript?

Jonathan Zbick
Zur Übersicht

Mehr vom DevSquad...

Lucas Meurer

Rudoku (Rust Sudoku Solver)

Dennis Hundertmark

Debug your CSS layouts the easy way