Wednesday, August 19, 2009

 

Oddities of Boolean evaluation in JavaScript

I had some naive notions about how JavaScript evaluated certain Boolean expressions. For example, I assumed that code like
if (x) { ... }
would always evaluate like
if (x == true) { ... }
I was wrong. For example,
if ([]) { ... }
evaluates to true, but
if ([] == true) { ... }
evaluates to false.

I wrote the following test to help me identify other perilous JavaScript irregularities.
Read the squares as:
if (y)
    green
else
    red

Most Interesting

[]
[] == true
[] != undefined
[0]
[0] == true
[0] != undefined
[1]
[1] == true
[1] != undefined
0
0 == true
0 != undefined
1
1 == true
1 != undefined
''
'' == true
'' != undefined
'1'
'1' == true
'1' != undefined
'0'
'0' == true
'0' != undefined
false
false == true
false != undefined
true
true == true
true != undefined
'false'
'false' == true
'false' != undefined
'true'
'true' == true
'true' != undefined
null
null == true
null != undefined
undefined
undefined == true
undefined != undefined

 

Double equal false things

[] == undefined
[] == null
[] == false
[0] == undefined
[0] == null
[0] == false
[1] == undefined
[1] == null
[1] == false
0 == undefined
0 == null
0 == false
1 == undefined
1 == null
1 == false
'' == undefined
'' == null
'' == false
'1' == undefined
'1' == null
'1' == false
'0' == undefined
'0' == null
'0' == false
false == undefined
false == null
false == false
true == undefined
true == null
true == false
'false' == undefined
'false' == null
'false' == false
'true' == undefined
'true' == null
'true' == false
null == undefined
null == null
null == false
undefined == undefined
undefined == null
undefined == false

 

Not equal false things

[] != undefined
[] != null
[] != false
[0] != undefined
[0] != null
[0] != false
[1] != undefined
[1] != null
[1] != false
0 != undefined
0 != null
0 != false
1 != undefined
1 != null
1 != false
'' != undefined
'' != null
'' != false
'1' != undefined
'1' != null
'1' != false
'0' != undefined
'0' != null
'0' != false
false != undefined
false != null
false != false
true != undefined
true != null
true != false
'false' != undefined
'false' != null
'false' != false
'true' != undefined
'true' != null
'true' != false
null != undefined
null != null
null != false
undefined != undefined
undefined != null
undefined != false

 

Double equal true

[]
[] == true
[] != true
[0]
[0] == true
[0] != true
[1]
[1] == true
[1] != true
0
0 == true
0 != true
1
1 == true
1 != true
''
'' == true
'' != true
'1'
'1' == true
'1' != true
'0'
'0' == true
'0' != true
false
false == true
false != true
true
true == true
true != true
'false'
'false' == true
'false' != true
'true'
'true' == true
'true' != true
null
null == true
null != true
undefined
undefined == true
undefined != true

 

Triple equal true

[] === true
[] !== true
[0] === true
[0] !== true
[1] === true
[1] !== true
0 === true
0 !== true
1 === true
1 !== true
'' === true
'' !== true
'1' === true
'1' !== true
'0' === true
'0' !== true
false === true
false !== true
true === true
true !== true
'false' === true
'false' !== true
'true' === true
'true' !== true
null === true
null !== true
undefined === true
undefined !== true

 

Triple equal false things

[] === undefined
[] !== undefined
[] === null
[] !== null
[] === false
[] !== false
[0] === undefined
[0] !== undefined
[0] === null
[0] !== null
[0] === false
[0] !== false
[1] === undefined
[1] !== undefined
[1] === null
[1] !== null
[1] === false
[1] !== false
0 === undefined
0 !== undefined
0 === null
0 !== null
0 === false
0 !== false
1 === undefined
1 !== undefined
1 === null
1 !== null
1 === false
1 !== false
'' === undefined
'' !== undefined
'' === null
'' !== null
'' === false
'' !== false
'1' === undefined
'1' !== undefined
'1' === null
'1' !== null
'1' === false
'1' !== false
'0' === undefined
'0' !== undefined
'0' === null
'0' !== null
'0' === false
'0' !== false
false === undefined
false !== undefined
false === null
false !== null
false === false
false !== false
true === undefined
true !== undefined
true === null
true !== null
true === false
true !== false
'false' === undefined
'false' !== undefined
'false' === null
'false' !== null
'false' === false
'false' !== false
'true' === undefined
'true' !== undefined
'true' === null
'true' !== null
'true' === false
'true' !== false
null === undefined
null !== undefined
null === null
null !== null
null === false
null !== false
undefined === undefined
undefined !== undefined
undefined === null
undefined !== null
undefined === false
undefined !== false

 

Labels:


This page is powered by Blogger. Isn't yours?