5 Stimmen

Javascript: Seltsames Vergleichsverhalten

Wenn ich das folgende Snippet in der FireBug-Konsole ausführe, wird es irgendwie gedruckt surprise! :

['surprise!', 'boring'][Number(0=="")]

Aber warum?

UPD

Tut mir leid, Leute, das war ein Scherz! Jere ist der erste, der es bemerkt hat! Gestern habe ich eine NULLBREITE LEERZEICHEN in einem String, und hatte seitdem die Versuchung, etwas Spaß zu haben =)

10voto

Jere Punkte 3317

Es gibt ein zusätzliches, nicht sichtbares Zeichen zwischen Ihre Zitate .

Wenn Sie dies eintippen, erhalten Sie 'langweilig', weil 0=="" zu true, Number(true) zu 1 ausgewertet wird.

Fügen Sie diese beiden ein und beobachten Sie die unterschiedliche Ausgabe:

0==""

Ausgänge falsch

0==""

Ausgänge wahr

Das einzige, was ich geändert habe, ist das Löschen des Zeichens zwischen "" .

9voto

Quentin Punkte 850700

0=="" ist false ( Weil Sie ein nichtdruckendes Zeichen in der Zeichenkette haben ), Number(false) ist 0 (gemäß Seite 34 der Spezifikation ), und "surprise" ist der 0. Index des Arrays.

4voto

Raynos Punkte 162170

ES5 11.9.3 Die == Betreiber

Wenn Typ(x) eine Zahl und Typ(y) ein String ist, das Ergebnis des Vergleichs x == ToNumber(y) zurück.

und

Der MV von StringNumericLiteral ::: [leer] ist 0.

Also 0=="" gibt zurück. 0 == ToNumber("") que es 0 == 0 was wahr ist.

Durch die == Umrechnungsregeln 0=="" ist true

ES5 15.7.1.1 Zahl ( Wert ) ruft auf. ES5 9.3 toNumber toNumber(true) === 1

Und ["suprize!", "boring"][1] gibt zurück. "boring" was eindeutig falsch ist.

Warum ist es richtig? Weil

"".charCodeAt(0) === 8203

Ihr String-Literal ist nicht der leere String. Sie haben eine Nullbreite Leerzeichen in Ihrer Zeichenfolge.

Wenn wir nun zurückgehen zu ES5 11.9.3 == Betreiber wir sehen

Wenn die Grammatik den String nicht als Erweiterung von StringNumericLiteral interpretieren kann

Das bedeutet

  • 0==""
  • 0==NaN
  • false
  • toNumber(false) === 0
  • Number(0=="") === 0
  • ["suprize!", "boring"][0] === "suprize!"

1voto

Gabriel Gartz Punkte 2730

['surprise!', 'boring'][Number(0=="")] wird 'langweilig' zurückgeben, weil Ihr Code:

Number(0=="") //returns true

Aber Ihr Code ist anders, Sie haben ein unsichtbares Zeichen in Ihrem Text, das ist, warum falsch zurückgegeben wird.

Wenn Sie den Code richtig schreiben, wird true zurückgegeben, und das Ergebnis wird sein boring wie erwartet.

Aber wenn Sie Ihren Code kopieren und einfügen, wird falsch zurückgegeben, deshalb haben Sie ein Zeichen zwischen dem "" (Sie können mit der Tastatur oder "".length überprüfen)

Ihr Code gibt also false zurück, das ist dann 0 und gibt 'surprise!

Du schummelst, Mann :P

['surprise!', 'boring'][Number(0=="")]

"".length //returns 1 ;)

"" != "" // OH GOD THIS IS TRUE :P

0voto

Pratik Punkte 317

Mir wird langweilig, wenn ich das in der Konsole ausführe console.log(['surpeise!','boring'][Number(0=="")])

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X