6

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.)

3
  • In which browser/environment are you seeing this behavior? Commented Nov 19, 2014 at 20:08
  • probably duplicated with this page of stackoverflow:stackoverflow.com/questions/5634372/… Commented Nov 19, 2014 at 20:09
  • @vagueness Yeah, pretty much. It didn't show up in my searches, unfortunately. Commented Nov 19, 2014 at 20:11

1 Answer 1

10

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
Sign up to request clarification or add additional context in comments.

1 Comment

@RobG: I only pointed out where Booleans are converted, but you are right, the way I phrased the sentence before creates other expectations. Updating :)

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.