2016-04-25 6 views
1

Ich habe eine Schwierigkeit zu verstehen, warum Warnung zeigt mir eine seltsame Dinge in der folgenden Ausdruck.Warum Javascript Alarm zeigt seltsame Werte mit Arrays und Objekten?

alert(!+{}[0]); //it shows "true" 

Warum "wahr", aber nicht "undefiniert"?

+0

Mögliches Duplikat von [Warum alert (!! "0") und alert (false == "0") beide in JavaScript true ausgeben] (http://stackoverflow.com/questions/4567393/why-do- alert0-and-alertfalse-0-beide-output-true-in-javascript) – Boratzan

+1

weil es somewat in js ist: https://www.destroyallsoft.com/de/talks/wat – Sugar

+0

Was denkst du, die Ausgabe _should_ sein? – Andy

Antwort

0

gehen Schritt für Schritt:

{}[0] == undefined 
+undefined == NaN 
!NaN == true 
2

Warum "true", aber nicht "undefined"?

Da ! ein boolescher Operator ist, der immer einen booleschen Wert zurückgibt. Es würde niemals den Wert undefined ergeben.

!false  // true 
!''  // true 
!null  // true 
!undefined // true 
!NaN  // true 
!0   // true 

Verwandte: What is the explanation for these bizarre JavaScript behaviours mentioned in the 'Wat' talk for CodeMash 2012?

+0

Also, es ist alle meine Ausdruck in Boolean nach "+" Zeichen konvertieren? – Alexey

+0

Nr. '!' Nimmt * any * Wert und wandelt es in einen booleschen Wert um. Das '+' wandelt jeden Wert in eine * Zahl * um. –

1

Dies liegt daran, die NOT operator ! will always return a boolean value, also wenn Sie Ihre Aussagen zu untersuchen waren, können Sie sie brechen könnte sich wie folgt zusammen:

{}[0]  // yields undefined 
+(undefined) // assumes arithemetic, but doesn't know how to handle it so NaN 
!(NaN)  // Since a boolean must be returned and something is there, return true 
0

Die Umwandlung wird auf diese Weise ausgeführt:

  1. !+{}[0] ({}[0] ->undefined)
  2. !+undefined (+undefined ->NaN)
  3. !NaN (NaN ist falsy ->false)
  4. !false
  5. true

Logik nicht ! immer Transformationen das Argument zu einem booleschen primitiven Typ.
Überprüfen Sie mehr über die falsy und .

Verwandte Themen