Don P: JS Typprobleme

Beitrag lesen

Hallo,

Soweit hab ich gar nicht gwagt zu denken - der Boolean Wert wird wirklich zu einer Zahl umgewandelt.

Wow. Ich wollte es jetzt doch ganz genau wissen. Es sieht so aus:

Zunächst für !'\n'==false

  1. If Type(x) is Boolean, return the result of the comparison ToNumber(x) == y.

x ist hier mit !'\n' ein boolescher Wert, der sich daraus ergibt, dass zunächst der NOT Operator ! auf den String '\n' angewendet wird.
Die Spezifikation sagt dazu für einen String:

11.4.9 Logical NOT Operator ( ! )
  The production UnaryExpression : ! UnaryExpression is evaluated as follows:
  1. Evaluate UnaryExpression.
  2. Call GetValue(Result(1)).

Das liefert den String.

3. Call ToBoolean(Result(2)).

und ToBoolean sagt:

"The result is false if the argument is the empty string (its length is zero); otherwise the result is true."

Also konvertiert '\n' hier zu true, wie du oben schon richtig angemerkt hast.

4. If Result(3) is true, return false.

Fertig: Das Ergebnis ist also false für !'n'.
Schließlich werden die beiden booleschen Werte verglichen:

  1. If Type(x) is Boolean, return true if x and y are both true or both false. Otherwise, return false.

Passt: !'\n'==false

Ok, und nun der andere Fall: '\n'==false
Hier greift

  1. If Type(y) is Boolean, return the result of the comparison x == ToNumber(y).

Tatsächlich: Der Boolesche Wert konvertiert erst zu einer Zahl, d.h. zu 0 für false.
Dann wird der String mit dieser Zahl verglichen:

17.If Type(x) is String and Type(y) is Number,

return the result of the comparison ToNumber(x) == y.
ToNumber() wird jetzt auch auf den String angewendet, nach einer speziellen Grammatik, wobei Whitespace berücksichtigt wird (siehe 9.3.1 in der Spezifikation).
Für einen String, der nur Whitespace enthält, ergibt das 0.
Passt: '\n'==false

Somit haben wir den paradoxen Fall, dass tatsächlich gilt:
'\n' == !'\n' sowie auch !'\n' == '\n'

Gruß, Don P