in Javascript,
var a = '';
var b = (a) ? true : false;
var b
wird auf gesetzt false
.
Ist dies ein definiertes Verhalten, auf das man sich verlassen kann?
javascript
string
boolean
cc jung
quelle
quelle
false
hierher: jsfiddle.net/8CKbd''
auf false in einem Booleschen Kontext ausgewertet wird also , wenna = '';
danna ? false : true
=>'' ? false : true
=>false ? false : true
=>true
(da ist die Auswertung für einen falschen Wert). Ich denke, es sollte seinvar b = (a) ? true : false;
, mit der nächsten Aussage richtig zu sein.Antworten:
Ja. Javascript ist ein Dialekt von ECMAScript, und die ECMAScript-Sprachspezifikation definiert dieses Verhalten klar:
Zitat aus http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf
quelle
new String("")
das wahr ist! Dies liegt daran, dass es sich um ein Objekt handelt, während die Kurzform""
die primitive Wertversion darstellt. Das gleiche gilt fürnew Number(0)
und sogarnew Boolean(false)
. Es ist ein guter Grund, die Objektversionen in Ihrem Code nicht zu verwenden, und dies bedeutet, dassif (str.length)
dieser Randfall behandelt wird, währendif (str)
dies nicht der Fall wäre.Ja. Alle
false
,0
leere Saiten''
und""
,NaN
,undefined
undnull
werden immer ausgewertet , wiefalse
; alles andere isttrue
.Und in Ihrem Beispiel steht b
false
nach der Auswertung. (Ich denke, Sie haben fälschlicherweise geschriebentrue
)quelle
null
ist nichtfalse
weder,true
,null
istnull
. jsfiddle.net/sq1Lkpg0NaN
und durchführenundefined
. Sie sind nicht,false
aber sie sind falsch. Welches ist, was gefragt wurde.Wie oben beantwortet, ja , das ist das definierte Verhalten eines leeren String in einem bedingten (ein
if
Ausdruck,||
,&&
,? :
, ...). (Der Standard besagt, dass die interne ToBoolean- Operation angewendet werden muss.)Die Auswertung ist unterschiedlich, wenn die leere Zeichenfolge in einem Vergleich verwendet wird (siehe Wahrheit, Gleichheit und JavaScript ), obwohl die Ergebnisse größtenteils gleich sind :
Erläuterung: Wenn die Operanden von
==
unterschiedliche Typen haben, versucht JavaScript im Wesentlichen, sie entsprechend ihrem Wert in Zahlen zu konvertieren (unter Verwendung von Operationen, die die Standardaufrufe ToNumber und ToPrimitive verwenden ), und gilt dann intern===
. Bei===
direkter Verwendung werden die Typen jedoch nicht konvertiert, sodass der Vergleich eines Strings mit einem Booleschen Wert immer erfolgtfalse
.Grob gesagt testen JavaScript- Bedingungen ( ToBoolean ) auf einen definierten Wert, der nicht null, nicht null, nicht leer und nicht falsch ist (ein leerer String ist ... leer, die Zahlen -0 oder +0 sind ... Null, NaN ist nicht eine definierte Zahl, aber ein leeres Objekt ist offenbar nicht wirklich leer) oder als Ich mag denken, conditionals Test für eine (true) Sache , während
==
vergleicht die scheinbaren, sorgfältig konvertierte Werte ( ToPrimitive , toNumber ) von seine Operanden und===
sucht nach exakter Gleichheit .Es gibt weitere Beispiele in Wahrheit, Gleichheit und JavaScript , wo diese Unterscheidung wirklich wichtig ist , zum Beispiel
'0'
isttrue
in einer bedingten (nicht-Null - Länge, oder es ist eine Sache ), aberfalse
in einem==
Vergleich (der Wert Null).'1'
wieder isttrue
in beiden Fällen (es ist eine Sache und hat einen Wert ungleich Null).quelle
var b
wird auf gesetzttrue
. Dies liegt daran, dass eine leere Zeichenfolge in JavaScript ebenso wie einige andere Werte als Falsey-Wert gilt.Unter http://www.sitepoint.com/javascript-truthy-falsy/ finden Sie falsche Werte
quelle
var b
wird tatsächlich auf gesetzt,true
weil es das Gegenteil von ist,var a
wenn Sie sich den Code ansehen.quelle