为什么下面的第一行会出错,尽管第二行和第三行工作正常?
1.toString(); // SyntaxError
(1).toString(); // OK
1['toString'](); // OK
答案 0 :(得分:11)
解析器正在尝试将1.
视为浮点文字的开头 - 只有toString
将其转换为无效数字。
与:比较:
1.0.toString()
答案 1 :(得分:11)
.
存在歧义。它是小数,还是属性访问器?
解释器将其视为小数,因此您可以使用..
同时允许小数,然后使用属性语法。
1..toString();
或者使用您展示的其他方式来解决歧义。
答案 2 :(得分:0)
在(1).toString()
中,(1)强制它在.toString()之前进行评估,以便它可以工作。
在1.toString()
中,1不是有效的标识符,因此不起作用。
答案 3 :(得分:0)
在Javascript中,可以通过以下两种方式之一来解释使用点(.
):
var prop = myObject.prop;
)。var num = 1.5;
)的一部分。在上述情况下,1.
中的前导1.toString()
被解释为浮点数,因此出现错误:
SyntaxError:标识符在数字文字(learn more)之后立即开始
如果尝试声明一个以数字开头的变量,您将遇到相同的错误: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']();