LoginSignup
3
1

More than 5 years have passed since last update.

009 == 011 -> true, '009' == 011 -> true, JavaScriptの8進数にまつわる不思議な話

Last updated at Posted at 2017-12-08
$ 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は独特の挙動はするものの、一定のルールには基づいているっぽいよ。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1