abcdefGets

ゲッツ!

JSのproposal-numeric-separatorを実装したよ

タイトルの通りなんだけど、書くのが遅れてしまった。
V8 のmasterにマージされた。

機能

javascriptのプロポーザルで数値リテラルの間にアンダースコアを挿入できるやつ

現在stage3にあってまだ正式に採用されているわけではない。

github.com

このスライドにも書いた

speakerdeck.com

例.

1_0_00_0
0xFF_FF_FF
0b0101_01_01
0o7_7_7

16進数、10進数、8進数、2進数の各リテラルに対応している。

あとBigIntにも当然対応している

39_950_934n

ただ、実装したあとに修正してもらったんだけど、implicit octalには対応していない。

0777_7 // Error!

あと、以下の場合はすべてエラー

0x_000 // Error !
0b_01 // Error !
0o_10 // Error !

アンダースコアの重複と末尾もだめ

12__00 // Error !
1200_ // Error !

制限

キャストされる数値には使えません!

Number('1_0_0') // Error !
parseInt('1_0_0', 10) // Error !

以下のIssueに詳しい

Numeric separator supported in implicit coercions, e.g., `+"0_0"`? · Issue #32 · tc39/proposal-numeric-separator · GitHub

簡単に話すと今までは

IsNaN(Number('1_0_0')) // true

だったので急にアンダースコアを数値として使えるようになると、NaNであることを期待しているコードが壊れるからという理由。
そのようなコードが一体どれほどあるのか知らないけど安全側に倒した。
breaking webを避けるためには仕方ないかなと言う感じ。

以上です。