DEV Community

Bill Schneider
Bill Schneider

Posted on

6 2

Opinions on truthiness across languages

A version of this article originally appeared on my GitHub pages blog

Different languages have different opinions about what to treat as "truthy" or "falsy" when using a non-boolean object as an expression inside an if statement.

I looked at Python, Groovy, Javascript and Ruby to compare their differences.

  • Null is always falsy
  • Zero and empty strings are falsy, except in Ruby
  • Empty collections (set/list/dict) are falsy in Python and Groovy but not Javascript or Ruby

My observations and personal opinions on language design:

  • Python treats zero, empty strings and collections all as 'falsy'. Personally, I find this the most intuitive convention.
    • Treatment of zero and null as falsy has historical precedent, from C. False and null pointers are both represented as zeros in a register or memory location.
    • Treatment of empty strings and collections is a nice convenience, given the number of times I've written conditionals like if (foo != null and !foo.empty()). It's usually the exception that I want to distinguish between null and empty in a conditional. So it's nice that if (foo) handles the common case, then I can write if (not foo is None) when I really do want to distinguish null.
    • Treatment of empty string as similar to null feels familiar from my Oracle experience. Also, it's consistent with treatment of an empty collection.
  • Groovy is inspired by Python and adopts similar conventions for truthiness.
  • Ruby takes a different opinion that all values are truthy except nil (and false, of course). While it's not my personal preference, it's defensible and self-consistent.
  • Javascript can reliably be expected to deliver a WTF. Javascript treats zero and empty strings as falsy, but empty collections as truthy. To me, it's hard to understand why strings and collections ought to behave differently; the Python behavior makes much more sense. But wait, it gets even better: check out this link on StackOverflow.

AWS GenAI LIVE image

Real challenges. Real solutions. Real talk.

From technical discussions to philosophical debates, AWS and AWS Partners examine the impact and evolution of gen AI.

Learn more

Top comments (3)

Collapse
 
lukaszkuczynski profile image
lukaszkuczynski • Edited

For me - but it's only an opinion - the very true is that only Booleans should be true. Of course, it's short to write, and I am lazy, too. I am using Pythonic truthiness very often. But how much more straightforward it is to treat true as true, and false as false. It would be more readable to use string.is_empty() or array.no_elements().

Collapse
 
wrschneider profile image
Bill Schneider

Are you arguing for static compile-time type checking in general, or specifically that if/while etc. should not accept non-boolean types?

Collapse
 
lukaszkuczynski profile image
lukaszkuczynski

I mean that it's more clear when we explicitly say: I am returning a boolean value. I am far from static type checking.

Billboard image

Create up to 10 Postgres Databases on Neon's free plan.

If you're starting a new project, Neon has got your databases covered. No credit cards. No trials. No getting in your way.

Try Neon for Free →