Rolf B: Frage zu Rückgabewerten von filter() bzw. find()

Beitrag lesen

Hallo Pep,

wie ich schon schrieb, das sind Feinheiten die man nicht unbedingt im Kopf hat. Ich habe dazu nochmal recherchiert und update das Wiki dementsprechend (hier, ist aber noch nicht gespeichert).

Der Fall "a" == true löst sich so auf:

  • Booleans werden vor einem == Test grundsätzlich in eine Zahl umgewandelt
    (true → 1, false → 0)

"a" == 1

  • Der Vergleich eines Strings mit einer Zahl erfolgt so, dass der String in seinen numerischen Wert konvertiert wird
    "a"NaN

NaN == 1
false

Man sagt oft, dass die beiden folgenden if gleichwertig sind:

if (a) { ... }
if (a == true) { ... }

Nein, nicht in JavaScript. Der erste if-Block wird für jeden Wert ausführt, der truthy ist. Der zweite if-Block dagegen nur für diejenigen a, für die Number(a) die Zahl 1 ergibt.

Gleichwertig sind dagegen diese Abfragen:

if (a) { ... }
if (!!a == true) { ... }
if (!!a === true) { ... }
if (Boolean(a) == true) { ... }
if (Boolean(a) === true) { ... }

Im Zeile 2 und 3 sorgt die doppelte Negation von a dafür, dass jedes a, das truthy ist, zu true wird.
In Zeile 4 und 5 konvertiert die Boolean-Funktion jeden falsy-Wert zu false und den Rest zu true. Damit klappt es auch.
Und weil mit !! bzw. Boolean dafür gesorgt wird, dass aus truthy true wird, ist es dann auch egal, ob man == oder === verwendet.

Die entsprechenden PHP Regeln habe ich jetzt noch nicht studiert. Sie sind vermutlich in feinen, aber gemeinen Details anders.

Und wie wird man das Problem gründlich los?

Verwende nicht .find(), sondern .some() oder besser noch .includes(). Die liefern true oder false zurück und du hast die Frage nach der echten Wahrheit nicht mehr zu klären. Mit .includes hast Du noch den Vorteil, dass Du keine geschachtelte Callback-Funktion brauchst.

Rolf

--
sumpsi - posui - obstruxi