调整字号

为什么 10.toString() 会报错?

在 JavaScript 里,Number 类型有很多方法,包括 toString()toFixed() 等等,通常调用时都会先定义一个变量,例如

var num = 10;
num.toString();  // "10"

如果你尝试直接在一个数字字面量上调用,比如 10.toString(),就会抛出一个异常:“SyntaxError: identifier starts immediately after numeric literal”。以前我一直以为是数字字面量不能调用方法,也没有去深究,今天正好做一套测试题的时候发现了 10..toString() 这种写法,就去查了一下。(这套JavaScript测试题挺古怪的,大家也可以去试试,考的都是平时不会用到的写法, 但是可以加深在某些方面的理解。)

之所以会报错,是因为在这里的 . 发生了歧义。它既可以理解为小数点,也可以理解为对方法的调用,问题就出在这里,我们想要后一种理解,而实际上,因为这个点紧跟于一个数字之后,按照规范,解释器就把它判断为一个小数点。我们也可以看下抛出的异常信息:“标识符紧跟于一个数字字面量之后。”说明 10.toString() 在解释器看来其实是:

(10.)toString();

所以只要再加上一个点就可以了:10..toString(),第一个点是数字的一部分,10. 被自动解释为整数值 10,而第二个点则是调用方法。

下面几种写法也是可行的:

(10).toString();
10 .toString();  //加个空格
10.0.toString();

抛出异常仅限于数字是整数的情况,如果数字本身就含有小数点,比如 10.2.toString() ,是完全正常的。

参考文章:(StackOverflow)Why does 2..toString() work?

评论(2条)

2012创业家 2013年9月11日 , 21:01

真奇葩

爱奇趣分享网 2015年9月15日 , 16:44

路过,留个脚印,网站很棒!

flight