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
I wrote the following test to help me identify other perilous JavaScript irregularities.
Read the squares as:
would always evaluate likeif (x) { ... }
I was wrong. For example,if (x == true) { ... }
evaluates to true, butif ([]) { ... }
evaluates to false.if ([] == true) { ... }
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: javascript
More Leif Wickland
Links
- My del.icio.us bookmarks -- a terse blog
- The up and coming, self-hosted, occationally up Wickland page
- Magistra Wickland enlivens language.
Archives
- September 2004
- October 2004
- November 2004
- December 2004
- January 2005
- February 2005
- March 2005
- April 2005
- May 2005
- June 2005
- July 2005
- August 2005
- September 2005
- October 2005
- November 2005
- December 2005
- January 2006
- February 2006
- March 2006
- April 2006
- May 2006
- June 2006
- July 2006
- August 2006
- September 2006
- October 2006
- November 2006
- January 2007
- May 2007
- June 2007
- August 2007
- September 2007
- October 2007
- November 2007
- December 2007
- January 2008
- February 2008
- March 2008
- April 2008
- May 2008
- June 2008
- July 2008
- August 2008
- September 2008
- October 2008
- November 2008
- January 2009
- February 2009
- March 2009
- April 2009
- August 2009
- September 2009
- October 2009
- November 2009
- December 2009
- March 2010
- May 2010
- June 2010
- January 2011
- February 2011
- March 2011
- April 2011
- June 2011
- July 2011
- October 2011
- January 2012
- April 2012
- March 2013
- November 2013
- December 2013
- November 2014
- January 2015
- January 2016
- February 2016