5

According to this table in the ECMAScript standard, string values that have length 0 should be evaluated as boolean false.

How come, then, these statements evaluate to true?

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

All those strings have a length greater than 0. For example:

Not falsey

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 comparison, but in this case in my code, I need the loose comparison, however I wasn't expecting a non-empty string to be considered falsey.)

Matt
  • 19,570
  • 12
  • 62
  • 104

1 Answers1

9

You are using loose comparison, which performs type conversion. Whenever you compare 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 is 0.


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
Felix Kling
  • 705,106
  • 160
  • 1,004
  • 1,072
  • @RobG: I only pointed out where Booleans are converted, but you are right, the way I phrased the sentence before creates other expectations. Updating :) – Felix Kling Nov 19 '14 at 21:20