This handy operator is a trouble maker.
TL;DR: Don't mix booleans with non-booleans.
-
Not Declarative Code
-
Hard to debug
-
Magic Castings
-
Accidental Complexity
-
Be Explicit
-
Don't mix Booleans with non-booleans.
-
Be Smarter than your compiler.
-
Stay loyal to the bijection.
The One and Only Software Design Principle
!true // returns false
!false // returns true
isActive = true
!isActive // returns false
age = 54
!age // returns false
array = []
!array // returns false
obj = new Object;
!obj // returns false
!!true // returns true
!!false // returns false
!!isActive // returns true
!!age // returns true
!!array // returns true
!!obj // returns true
!true // returns false
!false // returns true
isActive = true
!isActive // returns false
age = 54
!age // should return type mismatch (or 54 factorial!)
array = []
!array // should return type mismatch
obj = new Object;
!obj // should return type mismatch
// (what is an object negated in a real domain?)
!!true // returns true - it is idempotent
!!false // returns false - it is idempotent
!!isActive // returns true - it is idempotent
!!age // nonsense
!!array // nonsense
!!obj // nonsense
Since this is a "feature" in some languages it would be hard to test. We can set programming policies or choose more strict languages.
We should detect ! !! usages in non-boolean objects and warn our programmers.
-
Casting
-
Coercion
-
Javascript
Languages like JavaScript divide their whole universe into true or false values. This decision hides errors when dealing with non booleans.
We should be very strict and keep booleans (and their behavior), far away from non booleans.
Code Smell 24 - Boolean Coercions
Code Smell 06 - Too Clever Programmer
Code Smell 101 - Comparison Against Booleans
Photo by Greg Rakozy on Unsplash
It is easier to write an incorrect program than understand a correct one.
Alan J Perlis
Software Engineering Great Quotes
This article is part of the CodeSmell Series.