为什么10..toString()有效,但10.toString()不起作用?

And*_*old 67 javascript syntax

可能重复:
在JavaScript中使用toString

152..toString(2)
Run Code Online (Sandbox Code Playgroud)

正确创建二进制字符串"10011000",但是

152.toString(2)
Run Code Online (Sandbox Code Playgroud)

抛出一个例外

"SyntaxError:标识符在数字文字后立即启动"

为什么?后一种语法实际上听起来更正确,而前者看起来很奇怪!

Aln*_*tak 101

词法分析器(也称为"标记器")在读取新标记时,在第一次找到数字时,将继续消耗字符(即数字或一个点),直到它看到属于合法数字的字符.

<152.>是一个合法的令牌(不需要尾随0),但<152..>不是,所以你的第一个例子减少到这一系列的令牌:

<152.> <.> <toString> <(> <2> <)>
Run Code Online (Sandbox Code Playgroud)

这是合法的(和预期的)序列,而第二个看起来像

<152.> <toString> <(> <2> <)>
Run Code Online (Sandbox Code Playgroud)

这是非法的 - 没有句号将号码与号码分开toString.

  • 这是最清晰,最准确的答案,它应该被用户1689607接受. (7认同)
  • 作为旁注,jsparse(http://jsparse.meteor.com/)有一个实时的js lexer/parser,你可以看到js引擎解析"10".作为一个数字. (3认同)

I H*_*azy 100

一个.一个数后似乎模棱两可.它是小数还是对象成员运算符?

但是,解释器决定它是小数,所以你错过了成员运算符.

它看起来像这样:

(10.)toString();  // invalid syntax
Run Code Online (Sandbox Code Playgroud)

当您包含第二个时.,您有一个小数后跟成员运算符.

(10.).toString();
Run Code Online (Sandbox Code Playgroud)

@pedants和downvoters

. 角色提供了一个含糊不清.可以理解为成员运算符或小数,具体取决于其位置.如果没有歧义,那就毫无疑问.

规范.对该特定位置的字符的解释是它将是小数.这由ECMAScript的数字文字语法定义.

仅仅因为规范解决了JS解释器的歧义,并不意味着.角色的模糊性根本不存在.

  • `.`是*不*含糊不清.看我的回答. (8认同)
  • Lexers没有处理含糊不清的问题.*解析器*这样做.当这两个表达式到达解析器时,词法分析器已经明确地决定将哪些字符分组到哪个标记中. (3认同)