🐽

JavaScriptの10..toSting(3)というピリオドが2つ続く記述を見つけたのでを調べた

2020/09/24に公開

記事作成日: 2019-05-06

JavaScriptのNumber.prototype.toStringは引数にradixを持っており、n進数変換がサクッとできる

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Number/toString

let num = 10
num.toString(4)
// => "22"

で、これについて探っていた所、こんなやり方があることに気付いた

10..toString(4)
// => "22"

はて。10.. とは珍妙な。これはなにかと調べる。

ASTにかけてみる

AST Explorerで見てみる。

https://astexplorer.net/#/gist/2c4b10278940ebe6717e57845083e5b4/5b00a08e79475b0c67d7bd7c8293efff97f3b70a

するとこの部分に注目することができそうだ。

"callee": {
  "type": "MemberExpression",
  "object": {
    "type": "Literal",
    "value": 10, // 10の値
    "raw": "10." // 10. となっている
  },
  "property": {
    "type": "Identifier",
    "name": "toString" // これがtoStringになっている
  },
}

確かにJavaScriptは 10.010. と省略することができる。ちなみに、この逆で 0.1.1 と省略する事もできる
MDNだと浮動小数点数リテラルを見るとうっすら書いてある(が、ちゃんとこれについて書いてるのは見つけられなかった)

つまりこれは

10.0.toString(4)

の省略記法ということだ。すっきりした。

逆に . を一つにしてしまうと、小数点として扱われてしまうらしく

10.toString(4)

という記法は出来ない。

() をつければ正常に構文として扱えるので、下記が書き方一番無難であろう

(10).toString(4)

ナウい感じで行きたければOptional Chainingを使う手もあるだろう。全く意味の無いoptionalであるが、..よりは驚きが少なくタイプ数が少なくて済む

10?.toString(4)
GitHubで編集を提案

Discussion