本文深入探讨JavaScript中点号“.”的双重语义:作为浮点数的小数点与对象属性的访问符。通过1.toString()报错、(1).toString()成功及1..toString()的兼容机制等案例,解析JS引擎如何处理数字与属性间的歧义,并验证空格与Tab字符对点号解析的忽略规则。
JavaScript点号的双重语义
在JavaScript语言中,点号“.”具备两种不同的语义功能。
第一种语义对应数学中的小数点,用于定义浮点数,例如数值2.5。
第二种语义用于访问对象的属性或调用方法,例如调用数组的push方法:[].push(2)。
上述两种基本用法易于理解,但接下来讨论的情况则更为有趣。
数字与属性访问的冲突
参考以下代码示例:
// 分析这行代码的执行结果
1.toString();在Firebug中的显示效果如下

在此处,点号被解析为语义1(小数点),因此其后必须跟随数字。由于代码中跟随的是toString标识符,导致语法错误。
解决语法错误的方案
解决该问题的方法十分简单,例如添加小括号即可。
参考以下代码示例:
(1).toString();此外还存在另一种写法,虽然可行但相对晦涩。
参考以下代码示例:
1..toString();该写法在各浏览器中均能正常运行,原因在于各JS引擎将“1..toString()”解析为“1.0.toString()”。其中第一个点号承担语义1(小数点)的功能,第二个点号承担语义2(属性访问)的功能。
空格与Tab的解析规则
还存在一些看似奇怪的写法,同样不会引发报错。
参考以下代码示例:
1 .toString(); // 注意点号前面有一个空格显然,此处的点号执行语义2(属性访问)。JS引擎会忽略点号运算符前的空格,实际上无论点号前后是否存在空格,均会被忽略。具体表现如下:
参考以下代码示例:
1 . toString(); // 点号前后都有一个空格
1 . toString(); // 点号前后各有两个空格
1 .toString(); // 点号前有一个tab
1 . toString(); // 点号前后各有一个tabJS引擎不仅忽略空格字符,同样会忽略Tab制表符。