4

为什么下面的第一行会出错,尽管第二行和第三行工作正常?

1.toString(); // SyntaxError
(1).toString(); // OK
1['toString'](); // OK
4

4 回答 4

12

.呈现模棱两可。它是小数还是属性访问器?

解释器将其视为小数,因此您可以使用..同时允许小数,然后是属性语法。

1..toString();

或者使用您展示的其他方式之一来解决歧义。

于 2012-10-03T03:47:31.180 回答
11

解析器试图将其1.视为浮点文字的开头——只是toString将其转换为无效数字。

与之比较:

1.0.toString()
于 2012-10-03T03:47:11.193 回答
0

(1).toString(), (1) 强制它在 .toString() 之前进行评估,因此它可以工作。在1.toString(), 1 不是一个有效的标识符,所以它不起作用。

于 2015-04-27T06:48:50.253 回答
0

在 Javascript 中,使用点 ( .) 可以通过以下两种方式之一进行解释:

  1. 作为属性访问器(例如,var prop = myObject.prop;)。
  2. 作为浮点文字的一部分(例如var num = 1.5;)。

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']();
于 2019-09-03T17:42:15.867 回答