Ist in Javascript eine leere Zeichenfolge als Boolescher Wert immer falsch?


134

in Javascript,

var a = '';
var b = (a) ? true : false;

var bwird auf gesetzt false.

Ist dies ein definiertes Verhalten, auf das man sich verlassen kann?


Sind Sie sicher, ich kommefalse hierher: jsfiddle.net/8CKbd
anubhava

Ich ging noch einen Schritt weiter. Zeichenfolge mit Leerzeichen ist wahr. if ('') {console.log ('!')}, aber die '' == 0 ist wahr.
Azat

2
Ich denke , dass @JonH Ausgabe falsch ist, die leere Zeichenfolge ''auf false in einem Booleschen Kontext ausgewertet wird also , wenn a = '';dann a ? false : true=> '' ? false : true=> false ? false : true=> true(da ist die Auswertung für einen falschen Wert). Ich denke, es sollte sein var b = (a) ? true : false;, mit der nächsten Aussage richtig zu sein.
PhoneixS

@PhoneixS bearbeitet, hoffe es ist jetzt sinnvoller.
SwissCoder

1
@ SwissCoder war es nicht, dass nicht lesbar ist, sondern dass es eine andere Antwort ausgibt. Jetzt habe ich es korrigiert.
PhoneixS

Antworten:


191

Ja. Javascript ist ein Dialekt von ECMAScript, und die ECMAScript-Sprachspezifikation definiert dieses Verhalten klar:

ToBoolean

Das Ergebnis ist falsch, wenn das Argument der leere String ist (seine Länge ist Null). Andernfalls ist das Ergebnis wahr

Zitat aus http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf


Aaaaund es ist erledigt
Anthony

28
Eine Einschränkung ist, dass 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ür new Number(0)und sogar new Boolean(false). Es ist ein guter Grund, die Objektversionen in Ihrem Code nicht zu verwenden, und dies bedeutet, dass if (str.length)dieser Randfall behandelt wird, während if (str)dies nicht der Fall wäre.
Chris Middleton

54

Ja. Alle false, 0leere Saiten ''und "", NaN, undefinedund nullwerden immer ausgewertet , wie false; alles andere ist true.

Und in Ihrem Beispiel steht b falsenach der Auswertung. (Ich denke, Sie haben fälschlicherweise geschrieben true)


2
nullist nicht falseweder, true, nullist null. jsfiddle.net/sq1Lkpg0
Bruno Finger

7
@Bruno, Sie können den gleichen Test mit NaNund durchführen undefined. Sie sind nicht, falseaber sie sind falsch. Welches ist, was gefragt wurde.
Joseph

11

var a = '';
var b = (a) ? false : true;   // fixed!
console.log(b);               // => true

var bwird auf gesetzt true.

Ist dies ein definiertes Verhalten, auf das man sich verlassen kann?

Wie oben beantwortet, ja , das ist das definierte Verhalten eines leeren String in einem bedingten (ein ifAusdruck, ||, &&, ? :, ...). (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 :

// conditional (note: evaluation to false prints false here!)
console.log('' ? true : false); // zero length     => false

// comparisons
console.log('' == true);        // +0 === 1        => false
console.log('' == false);       // +0 === +0       => true
console.log('' === true);       // different types => false
console.log('' === false);      // different types => false

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 erfolgt false.

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 .

if (X) {}        // is X a (true) thing?
if (X == Y) {}   // are the values of X and Y same-ish?
if (X === Y) {}  // are X and Y exactly the same?

Es gibt weitere Beispiele in Wahrheit, Gleichheit und JavaScript , wo diese Unterscheidung wirklich wichtig ist , zum Beispiel '0'ist truein einer bedingten (nicht-Null - Länge, oder es ist eine Sache ), aber falsein einem ==Vergleich (der Wert Null). '1'wieder ist truein beiden Fällen (es ist eine Sache und hat einen Wert ungleich Null).

console.log('' ? true : false);   // zero length     => false
console.log('' == true);          // +0 === 1        => false
console.log('0' ? true : false);  // non-zero length => true
console.log('0' == true);         // +0 === 1        => false
console.log('1' ? true : false);  // non-zero length => true
console.log('1' == true);         //  1 === 1        => true


1
Zuerst dachte ich: "Pssh, das ist übertrieben, das wurde bereits gut beantwortet." Aber das war gut präsentiert und informativ. Vielen Dank.
Marc L.

8

var bwird auf gesetzt true. 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


Sie sind falsch in Ihrer Antwort. var bwird tatsächlich auf gesetzt, trueweil es das Gegenteil von ist, var awenn Sie sich den Code ansehen.
Bombek

@bombek Danke - ich werde upate. Es sieht so aus, als ob die ursprüngliche Frage nach meiner Antwort bearbeitet wurde (die Werte wurden vertauscht)
Jonathon Bolster

5

Beispiele für Ausdrücke, die in false konvertiert werden können, sind solche, die als null, 0, die leere Zeichenfolge ("") oder undefiniert ausgewertet werden. (siehe MDN-Referenz )

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.