我们今天偶然发现了这个:
123.toString();
// Uncaught SyntaxError: Invalid or unexpected token
123 .toString();
// "123"
Run Code Online (Sandbox Code Playgroud)
为什么添加空间有效?数字文字是被强制还是强制转换?
我尝试了一些其他测试来阐明一些情况,但我不太明白幕后发生了什么:
let number = 123;
number.toString();
// "123"
Object.prototype.toString.call(123);
// "[object Number]"
Object.prototype.toString.call(123 );
// "[object Number]"
Run Code Online (Sandbox Code Playgroud)
在第一种语法中,.被解释为小数分隔符(必须与数字相邻)。在这种情况下toString是意外的,并且表示语法错误。
属性点也不会是相邻的,以它遵循的对象。始终允许间隔。所以当你有空间时,就没有歧义了,可以正确解释点。
另一种变体是将点加倍:
123..toString()
Run Code Online (Sandbox Code Playgroud)
这里的第一个点是小数点分隔符,但后面没有数字(这是数字的有效语法)。第二个点又是属性点。
或者也:
(123).toString()
123.0.toString()
Run Code Online (Sandbox Code Playgroud)
只要您能确保.toString()不能将of 的点解释为数字文字的一部分,它就会按您的预期工作。
并且当您访问基元的属性时,该基元会即时装箱到包装器对象中,以便您实际执行以下操作:
Number(123).toString()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
56 次 |
| 最近记录: |