According to this table in the ECMAScript standard, string values that have length 0 should be evaluated as boolean false
.
How e, then, these statements evaluate to true
?
"\t" == false
" " == false
"\n" == false
" " == false
All those strings have a length greater than 0. For example:
While I understand that "0"
evaluates to false
because it can be coerced to a numeric 0
, I can't explain why these strings are falsey. What's going on?
(Obviously I can use ===
for a strict parison, but in this case in my code, I need the loose parison, however I wasn't expecting a non-empty string to be considered falsey.)
According to this table in the ECMAScript standard, string values that have length 0 should be evaluated as boolean false
.
How e, then, these statements evaluate to true
?
"\t" == false
" " == false
"\n" == false
" " == false
All those strings have a length greater than 0. For example:
While I understand that "0"
evaluates to false
because it can be coerced to a numeric 0
, I can't explain why these strings are falsey. What's going on?
(Obviously I can use ===
for a strict parison, but in this case in my code, I need the loose parison, however I wasn't expecting a non-empty string to be considered falsey.)
- In which browser/environment are you seeing this behavior? – Reinstate Monica -- notmaynard Commented Nov 19, 2014 at 20:08
- probably duplicated with this page of stackoverflow:stackoverflow./questions/5634372/… – Reza Commented Nov 19, 2014 at 20:09
- @vagueness Yeah, pretty much. It didn't show up in my searches, unfortunately. – Matt Commented Nov 19, 2014 at 20:11
1 Answer
Reset to default 10You are using loose parison, which performs type conversion. Whenever you pare against a Boolean, both values are actually converted to numbers (spec, steps 7 and 5). false
is 0
and (surprisingly!)every string containing only white space characters is converted to 0
as well (when converted to a number) (spec):
The MV of
StringNumericLiteral ::: StrWhiteSpace
is0
.
I wasn't expecting a non-empty string to be considered falsey
Comparing a value against a Boolean is very different from converting a value to a Boolean. "Falsy" means that the value is converted to false
when converted to a Boolean. However, again, in your case the values are converted to numbers first.
Example:
Number(" ") // 0 ( == Number(false))
// vs
Boolean(" ") // true