非常に興味深かったので紹介。
ちょっとよく解らんっちゃけど。
152..toString(2)
これだとバイナリ文字列"10011000"が正しく生成されるっちゃけど、
152.toString(2)
これだと"SyntaxError: identifier starts immediately after numeric literal"って内容の例外が発生するっちゃんね。
なんで? 後者の方がまともな文で、前者は変な文に見えるっちゃけど?!
確かに。
回答を総合すると、これは、".
"が複数の意味を持つ所為だという。即ち、小数点としてのそれと、"object member operator"としてのそれと。
JavaScriptの数値リテラルは小数点の前後の数値が0の場合は、それを省略する事が出来る(Final draft Standard ECMA-262 edition 5.1, March 2011 (Rev. 6) - Ecma-262.pdfの7.8.3 Numeric Literals)。
(1.) == (1.0) // true
(.1) == (0.1) // true
因って、"152.toString(2)
"は、"152.
"迄で1つの数値リテラルトークンとして処理され、続く"toString
"が解釈出来なくなりSyntax Errorとなるそうだ。
対し、"152..toString(2)
"と".
"を2つ連続させた場合は、1つ目が小数点、2つ目がobject member operatorとして解釈されるため、正しく処理出来ると。
言われて初めて気づいたが、確かに小数点とobject member operatorは同じ記号だ。あまりにも当たり前すぎて、今までまったく気にかけた事がなかったなぁ……
- object member operator
- この回答で使われていた言葉を拝借。オブジェクトとそのメンバを区切る"."記号の事。EcmaScriptの規格書を簡単に攫ってみたが、この"."の正式な名称はよく分からなかった。
ラベル:EcmaScript javascript