Czy w javascript pusty ciąg jest zawsze fałszywy jako wartość logiczna?

136

w javascript,

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

var bzostanie ustawiony na false.

czy jest to określone zachowanie, na którym można polegać?

cc młody
źródło
Czy na pewno dostaję się falsetutaj: jsfiddle.net/8CKbd
anubhava
Poszedłem o krok dalej. Ciąg ze spacjami jest prawdziwy. if ('') {console.log ('!')} ale '' == 0 jest prawdą.
Azat
2
Myślę, że edycja @JonH jest błędna, pusty ciąg ''jest oceniany jako fałszywy w kontekście logicznym, więc jeśli a = '';wtedy a ? false : true=> '' ? false : true=> false ? false : true=> true(ponieważ jest to ocena dla fałszywej wartości). Myślę, że var b = (a) ? true : false;następne stwierdzenie powinno być poprawne.
PhoneixS
@PhoneixS edytowane, mam nadzieję, że teraz jest bardziej znaczące.
SwissCoder
1
@SwissCoder to nie było nieczytelne, ale wyświetla inną odpowiedź. Teraz to poprawiłem.
PhoneixS

Odpowiedzi:

198

Tak. Javascript jest dialektem ECMAScript, a specyfikacja języka ECMAScript jasno definiuje to zachowanie:

ToBoolean

Wynik jest fałszywy, jeśli argument jest pustym ciągiem (jego długość wynosi zero); w przeciwnym razie wynik jest prawdziwy

Cytat pochodzi z http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf

Arenielle
źródło
Aaaa i ustalone
Anthony
29
Jedynym zastrzeżeniem jest to, że new String("")to prawda! Dzieje się tak, ponieważ jest to obiekt, podczas gdy krótka forma ""reprezentuje pierwotną wersję wartości. To samo dotyczy, new Number(0)a nawet new Boolean(false). Jest to dobry powód, aby nie używać wersji obiektów w kodzie, a to oznacza, że if (str.length)obsługuje ten przypadek skrajny if (str), podczas gdy nie.
Chris Middleton,
54

Tak. Wszystko false, 0, puste struny ''i "", NaN, undefined, i nullsą zawsze oceniane jako false; wszystko inne jest true.

W twoim przykładzie b jest falsepo ocenie. (Myślę, że omyłkowo napisałeś true)

Hossein
źródło
2
nullnie jest falseani true, nulljest null. jsfiddle.net/sq1Lkpg0
Bruno Finger
7
@Bruno, możesz wykonać ten sam test za pomocą NaNi undefined. Nie są, falseale są fałszywi. O to właśnie pytano.
Joseph,
11

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

var bzostanie ustawiony na true.

czy jest to określone zachowanie, na którym można polegać?

Jak odpowiedział wyżej, tak , że jest zdefiniowane zachowanie pusty ciąg w ramach warunkowego (e ifwypowiedzi, ||, &&, ? :, ...). ( Norma mówi, że należy zastosować wewnętrzną operację ToBoolean ).

Ocena jest inna, gdy w porównaniu używany jest pusty ciąg (patrz Prawda, Równość i JavaScript ), nawet jeśli wyniki są w większości takie same :

// 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

Objaśnienie: Zasadniczo, gdy operandy z ==mają różne typy, JavaScript usilnie próbuje przekształcić je w Numbers, zgodnie z ich wartością ( używając operacji, które standard wywołuje ToNumber i ToPrimitive ), a następnie stosuje się to wewnętrznie ===. Ale gdy używasz ===bezpośrednio, typy nie są konwertowane, więc zawsze porównuje się ciąg znaków z wartością logiczną false.

Z grubsza rzecz biorąc, warunkowe JavaScript ( ToBoolean ) testują zdefiniowaną, niezerową, niezerową, niepustą, inną niż fałsz wartość (pusty łańcuch jest ... pusty, liczby -0 lub +0 to ... zero, NaN nie jest zdefiniowaną liczbą, ale pusty Obiekt najwyraźniej nie jest naprawdę pusty) lub, jak lubię myśleć, warunkowe testuje (prawdziwą) rzecz , ==porównując pozorne, starannie przekonwertowane wartości ( ToPrimitive , ToNumber ) jej operandy i ===szuka dokładnej identyczności .

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?

W Prawda, Równość i JavaScript jest więcej przykładów, w których to rozróżnienie naprawdę ma znaczenie, np. '0'Jest truewarunkowe (niezerowa długość lub, jest rzeczą ), ale falsew ==porównaniu ( wartość wynosi zero). '1'znowu jest truew obu przypadkach (jest rzeczą i ma wartość niezerową).

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

Orafu
źródło
1
Na początku pomyślałem: „pssh, to przesada, na to już dobrze odpowiedziano”. Ale to było dobrze przedstawione i pouczające. Dzięki.
Marc L.,
8

var bzostanie ustawiony na true. Dzieje się tak, ponieważ pusty ciąg liczy się jako wartość „falsey” w JavaScript, podobnie jak niektóre inne wartości.

Sprawdź http://www.sitepoint.com/javascript-truthy-falsy/ pod kątem fałszywych wartości

Jonathon Bolster
źródło
Mylisz się w swojej odpowiedzi. var bfaktycznie zostanie ustawiony na, trueponieważ jest to przeciwieństwo tego, var agdy spojrzysz na kod.
bombek
@bombek Thanks - I'll upate. Wygląda na to, że oryginalne pytanie zostało zmodyfikowane po mojej odpowiedzi (wartości zostały zamienione)
Jonathon Bolster
5

Przykładami wyrażeń, które można przekonwertować na fałsz, są wyrażenia, których wynikiem jest null, 0, pusty ciąg („”) lub nieokreślony. (patrz Dokumentacja MDN )

Marcel Jackwerth
źródło