$ node
> 009 == 011
true
なんだだこれは?
JavaScriptの8進数
JavaScriptのnum型の最初に0がついていると、8進数として扱われます。
というわけで、
> 011
9
こうなります。ここまでは普通。
問題は009の挙動で、どうやらJSは8進数に9が混ざると10進数として扱い、頭の0を無視するらしい。
そういうわけで、009==011 -> true なかなか不思議な挙動ですね。
ちなみに、どちらも数値型なので、
> 009 === 011
true
当然こちらもtrue。
'009' == 011, 009 == '011'
> '009' == 011
true
> 009 == '011'
false
こんな挙動になります。
一瞬迷いますが、parseIntを使うと簡単に説明できます。
> parseInt('009')
9
> parseInt('011')
11
どうも自動でparseするときには基数10でparseされ、前方についている0は無視されるようです。
parseIntは基数を指定できるけど……
> parseInt('011', 8)
9
当然 '011'をparseすると10進数では 9になります。
ただ……
> parseInt('009', 8)
0
エラーはないらしい
まとめ
JavaScriptは独特の挙動はするものの、一定のルールには基づいているっぽいよ。