w javascript,
var a = '';
var b = (a) ? true : false;
var b
zostanie ustawiony na false
.
czy jest to określone zachowanie, na którym można polegać?
javascript
string
boolean
cc młody
źródło
źródło
false
tutaj: jsfiddle.net/8CKbd''
jest oceniany jako fałszywy w kontekście logicznym, więc jeślia = '';
wtedya ? false : true
=>'' ? false : true
=>false ? false : true
=>true
(ponieważ jest to ocena dla fałszywej wartości). Myślę, żevar b = (a) ? true : false;
następne stwierdzenie powinno być poprawne.Odpowiedzi:
Tak. Javascript jest dialektem ECMAScript, a specyfikacja języka ECMAScript jasno definiuje to zachowanie:
Cytat pochodzi z http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf
źródło
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 nawetnew Boolean(false)
. Jest to dobry powód, aby nie używać wersji obiektów w kodzie, a to oznacza, żeif (str.length)
obsługuje ten przypadek skrajnyif (str)
, podczas gdy nie.Tak. Wszystko
false
,0
, puste struny''
i""
,NaN
,undefined
, inull
są zawsze oceniane jakofalse
; wszystko inne jesttrue
.W twoim przykładzie b jest
false
po ocenie. (Myślę, że omyłkowo napisałeśtrue
)źródło
null
nie jestfalse
anitrue
,null
jestnull
. jsfiddle.net/sq1Lkpg0NaN
iundefined
. Nie są,false
ale są fałszywi. O to właśnie pytano.var a = ''; var b = (a) ? false : true; // fixed! console.log(b); // => true
Jak odpowiedział wyżej, tak , że jest zdefiniowane zachowanie pusty ciąg w ramach warunkowego (e
if
wypowiedzi,||
,&&
,? :
, ...). ( 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'
Jesttrue
warunkowe (niezerowa długość lub, jest rzeczą ), alefalse
w==
porównaniu ( wartość wynosi zero).'1'
znowu jesttrue
w 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
źródło
var b
zostanie ustawiony natrue
. 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
źródło
var b
faktycznie zostanie ustawiony na,true
ponieważ jest to przeciwieństwo tego,var a
gdy spojrzysz na kod.źródło