解析JavaScript中点号“.”的多义性

作者:青柠

时间:2026-10-28

浏览:316

本文深入探讨JavaScript中点号“.”的双重语义:作为浮点数的小数点与对象属性的访问符。通过1.toString()报错、(1).toString()成功及1..toString()的兼容机制等案例,解析JS引擎如何处理数字与属性间的歧义,并验证空格与Tab字符对点号解析的忽略规则。

文章目录

JavaScript点号的双重语义

在JavaScript语言中,点号“.”具备两种不同的语义功能。

第一种语义对应数学中的小数点,用于定义浮点数,例如数值2.5。

第二种语义用于访问对象的属性或调用方法,例如调用数组的push方法:[].push(2)。

上述两种基本用法易于理解,但接下来讨论的情况则更为有趣。

数字与属性访问的冲突

参考以下代码示例:

// 分析这行代码的执行结果
1.toString();

在Firebug中的显示效果如下JavaScript点号的双重语义

在此处,点号被解析为语义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(); // 点号前后各有一个tab

JS引擎不仅忽略空格字符,同样会忽略Tab制表符。

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章