2014-11-19 15 views
5

Zgodnie z this table in the ECMAScript standard wartości łańcuchów, które mają długość 0, powinny być ocenione jako logiczne false.Dlaczego niektóre niepuste ciągi oceniają na "false" w JavaScript?

W takim razie, te stwierdzenia oceniają na true?

"\t" == false 
" " == false 
"\n" == false 
"  " == false 

Wszystkie te struny mają długość większą niż 0. Na przykład:

Not falsey

Choć rozumiem, że "0" ocenia się false ponieważ może być zmuszany do numerycznej 0, mogę” t wyjaśnić, dlaczego te struny są falsey. Co się dzieje?

(Oczywiście można używać === do ścisłego porównania, ale w tym przypadku w moim kodu, muszę luźne porównanie, jednak nie spodziewałem się niepusty łańcuch należy uznać falsey.)

+0

W której przeglądarka/środowisko widzisz to zachowanie? – iamnotmaynard

+0

Prawdopodobnie powielono na tej stronie stackoverflow: http: //stackoverflow.com/questions/5634372/why-is-t-n-false-in-javascript – Reza

+0

@vaggia Tak, prawie. Niestety nie pojawił się w moich poszukiwaniach. – Matt

Odpowiedz

9

Używasz luźnego porównania, które wykonuje konwersję typu . Ilekroć porównujesz z wartością logiczną, obie wartości są w rzeczywistości konwertowane na liczby (spec, steps 7 and 5). false jest 0 i każdy ciąg zawierający tylko białe znaki są konwertowane do 0 jak również (po przeliczeniu na liczbę) (spec) (zaskakująco!):

MV od StringNumericLiteral ::: StrWhiteSpace jest 0.


nie spodziewałem niepusty ciąg należy uznać falsey

Porównując wartość przeciw Boolean jest bardzo odmienna od konwersji wartość do Boolean. "Falsy" oznacza, że ​​wartość jest konwertowana na false po przekonwertowaniu na wartość logiczną. Jednak w twoim przypadku wartości są najpierw konwertowane na liczby.

Przykład:

Number(" ") // 0 (== Number(false)) 
// vs 
Boolean(" ") // true 
+0

@RobG: Zwróciłem uwagę tylko na to, gdzie Booleanie się nawracają, ale masz rację, sposób w jaki sformułowałem zdanie przedtem tworzy inne oczekiwania. Aktualizacja :) –

Powiązane problemy