为什么下面的第一行会出错,尽管第二行和第三行工作正常?
1.toString(); // SyntaxError
(1).toString(); // OK
1['toString'](); // OK
为什么下面的第一行会出错,尽管第二行和第三行工作正常?
1.toString(); // SyntaxError
(1).toString(); // OK
1['toString'](); // OK
.
呈现模棱两可。它是小数还是属性访问器?
解释器将其视为小数,因此您可以使用..
同时允许小数,然后是属性语法。
1..toString();
或者使用您展示的其他方式之一来解决歧义。
解析器试图将其1.
视为浮点文字的开头——只是toString
将其转换为无效数字。
与之比较:
1.0.toString()
在(1).toString()
, (1) 强制它在 .toString() 之前进行评估,因此它可以工作。在1.toString()
, 1 不是一个有效的标识符,所以它不起作用。
在 Javascript 中,使用点 ( .
) 可以通过以下两种方式之一进行解释:
1.
在上述情况下,前导1.toString()
被解释为浮点数,因此错误:
SyntaxError:标识符在数字文字之后立即开始(了解更多)
如果您尝试声明一个以数字开头的变量,这与您得到的错误相同:var 1person = 'john';
为了防止解释器将1.
视为小数,而是将其视为访问我们文字上的属性1
,有几种方法可以完成此操作:
// Via white-space after the numeric literal
1 .toString();
1
.toString();
// Via a grouping-operator, aka, parentheses
// @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Expressions_and_Operators#Grouping_operator
(1).toString();
// Via an additional dot. Made clearer with parentheses as `(1.).toString()`
1..toString();
// Via an explicit fractional part (because `1. === 1.0`)
1.0.toString();
// Via bracket notation
1['toString']();
1.['toString']();
1.0['toString']();