I noticed something today about Arrays in JavaScript that struck me as a bit odd. I imagine there is an easy explanation that will make perfect sense when I hear it, but until then I thought I would ask the community.

If I use an Array as the sole component of a conditional statement, the statment evaluates to true whether the array is empty or not. However, if the conditional statement is loosely comparing (==) the array to a truthy value, then it evaluates to false, again whether its empty or not. I created a Fiddle to show what I mean: http://jsfiddle.net/dcdruck/X6L8m/11/

Would someone please try to explain to me why an Array is considered truthy on its own but not when compared to another truthy value?

5 Years
Discussion Span
Last Post by dcdruck
function isTruthy(a,b) { if (a) setTrue(b); else setFalse(b); };

This is not checking whether the array is empty, it's simply checking if that object/variable exists.

function isTrue(a,b) { if (a === true) setTrue(b); else setFalse(b); };

This outputs false because you're comparing the array object to the primitive value true.

function isTruish(a,b) { if (a == true) setTrue(b); else setFalse(b); };

This is a little more complicated, though I think the top answer on this StackOverflow question explains it better than I could.

function isTruthyAnd(a,b) { if (a && true) setTrue(b); else setFalse(b); 

Like the first function, you're only testing whether the variable/object exists. If you put if (true) as a check for anything, it will always be true.


I guess that sorta makes sense. I think it struck me as odd that the array's existence is being evaluated in the first one instead of the array itself being evaluated. I would have expected if (someArray) and if (someArray == true) and if (someArray == 1) all to evaluate the same, but I was wrong. I would have expected Javascript to do the same internal conversion on someArray to convert it to a scalar value (like Array.prototype.toString) regardless of what else was in the conditional statement.

Thanks for the input and the link! I'm marking this as solved.

This question has already been answered. Start a new discussion instead.
Have something to contribute to this discussion? Please be thoughtful, detailed and courteous, and be sure to adhere to our posting rules.