All falsey values in JavaScript
Don't forget about the non-empty string "false"
which evaluates to true
Just to add to @user568458's list of falsy values:
In addition to integer number 0, the decimal number 0.0, 0.00 or any such zeroish number is also a falsy value.
var myNum = 0.0; if(myNum){ console.log('I am a truthy value'); } else { console.log('I am a falsy value'); }
Above code snippet prints
I am a falsy value
Similarly hex representation of the number 0 is also a falsy value as shown in below code snippet:
var myNum = 0x0; //hex representation of 0 if(myNum){ console.log('I am a truthy value'); } else { console.log('I am a falsy value'); }
Above code snippet again prints
I am a falsy value
.
Addition to the topic, as of ES2020 we have a new value which is falsy, it's BigInt zero (0n):
0n == false // true
-0n == false // true
0n === false // false
-0n === false // false
So with this, we now have 7 "falsy" values in total (not including document.all as mentioned by user above since it's part of DOM and not JS).
Falsey values in JavaScript
false
- Zero of
Number
type:0
and also-0
,0.0
, and hex form0x0
(thanks RBT) - Zero of
BigInt
type:0n
and0x0n
(new in 2020, thanks GetMeARemoteJob) ""
,''
and``
- strings of length 0null
undefined
NaN
document.all
(in HTML browsers only)- This is a weird one.
document.all
is a falsey object, withtypeof
asundefined
. It was a Microsoft-proprietory function in IE before IE11, and was added to the HTML spec as a "willful violation of the JavaScript specification" so that sites written for IE wouldn't break on trying to access, for example,document.all.something
; it's falsy becauseif (document.all)
used to be a popular way to detect IE, before conditional comments. See Why is document.all falsy? for details
- This is a weird one.
"Falsey" simply means that JavaScript's internal ToBoolean
function returns false
. ToBoolean
underlies !value
, value ? ... : ...;
and if (value)
. Here's its official specification (2020 working draft) (the only changes since the very first ECMAscript specification in 1997 are the addition of ES6's Symbols, which are always truthy, and BigInt
, mentioned above:
Argument type Result Undefined Return false
.Null Return false
.Boolean Return argument. Number If argument is +0
,-0
, orNaN
, returnfalse
; otherwise returntrue
.String If argument is the empty String
(its length is zero), returnfalse
; otherwise returntrue
.BigInt If argument is 0n
, returnfalse
; otherwise returntrue
.Symbol Return true
.Object Return true
.
Comparisons with ==
(loose equality)
It's worth talking about falsy values' loose comparisons with ==
, which uses ToNumber()
and can cause some confusion due to the underlying differences. They effectively form three groups:
false, 0, -0, "", ''
all match each other with==
- e.g.
false == ""
,'' == 0
and therefore4/2 - 2 == 'some string'.slice(11);
- e.g.
null, undefined
match with==
- e.g.
null == undefined
butundefined != false
- It's also worth mentioning that while
typeof null
returns'object'
,null
is not an object, this is a longstanding bug/quirk that was not fixed in order to maintain compatibility. It's not a true object, and objects are truthy (except for that "wilful violation"document.all
when Javascript is implemented in HTML)
- e.g.
NaN
doesn't match anything, with==
or===
, not even itself- e.g.
NaN != NaN
,NaN !== NaN
,NaN != false
,NaN != null
- e.g.
With "strict equality" (===
), there are no such groupings. Only false
===
false
.
This is one of the reasons why many developers and many style guides (e.g. standardjs) prefer ===
and almost never use ==
.
Truthy values that actually == false
"Truthy" simply means that JavaScript's internal ToBoolean
function returns true
. A quirk of Javascript to be aware of (and another good reason to prefer ===
over ==
): it is possible for a value to be truthy (ToBoolean
returns true
), but also == false
.
You might think if (value && value == false) alert('Huh?')
is a logical impossibility that couldn't happen, but it will, for:
"0"
and'0'
- they're non-empty strings, which are truthy, but Javascript's==
matches numbers with equivalent strings (e.g.42 == "42"
). Since0 == false
, if"0" == 0
,"0" == false
.new Number(0)
andnew Boolean(false)
- they're objects, which are truthy, but==
sees their values, which== false
.0 .toExponential();
- an object with a numerical value equivalent to0
- Any similar constructions that give you a false-equaling value wrapped in a type that is truthy
[]
,[[]]
and[0]
(thanks cloudfeet for the JavaScript Equality Table link)
Some more truthy values
These are just a few values that some people might expect to be falsey, but are actually truthy.
-1
and all non-zero negative numbers' '
," "
,"false"
,'null'
... all non-empty strings, including strings that are just whitespaceAnything from
typeof
, which always returns a non-empty string, for example:typeof null
(returns a string'object'
due to a longstanding bug/quirk)typeof undefined
(returns a string'undefined'
)
Any object (except that "wilful violation"
document.all
in browsers). Remember thatnull
isn't really an object, despitetypeof
suggesting otherwise. Examples:{}
[]
function(){}
or() => {}
(any function, including empty functions)Error
and any instance ofError
- Any regular expression
- Anything created with
new
(includingnew Number(0)
andnew Boolean(false)
)
Any Symbol
true
, 1
, "1"
and [1]
return true
when compared to each other with ==
.