2012年11月05日

なぜJavaScriptでは 10..toString() は動き、 10.toString() は動かないのか

javascript - Why 10..toString() works but 10.toString() does not? - Stack Overflow

非常に興味深かったので紹介。

ちょっとよく解らんっちゃけど。

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
posted by 天井冴太 at 04:51| Comment(0) | TrackBack(0) | Study | 更新情報をチェックする
この記事へのコメント
コメントを書く
コチラをクリックしてください

この記事へのトラックバック