调用数字文字的成员函数
我试图调用文字function,但我得到奇怪的行为。
考虑这个返回true
代码。
23 === (23)
当我写的时候尝试以下。
(23).toFixed(2)
我得到预期的结果_23.00_
但是当我尝试23.toFixed(2)
我得到这个错误。
SyntaxError:意外的标记ILLEGAL
JavaScript如何评估无法理解的expression式,为什么会出现此错误?
Greg Hewgill和icktoofay的答案在所有方面都是正确的,但是,我想稍微抽象一点:根据javascript规范,我们来看看究竟发生了什么。
规范的第7.8.3节定义了数字文字。 我们可以看到以下内容:
DecimalLiteral :: DecimalIntegerLiteral . DecimalDigits(opt) ExponentPart(opt) . DecimalDigits ExponentPart(opt) DecimalIntegerLiteral ExponentPart(opt) DecimalIntegerLiteral :: 0 NonZeroDigit DecimalDigits(opt)
DecimalLiteral
是一个十进制数字,可能后跟一个点,后面可能跟着其他数字(所有这些数字都可以跟一个指数,例如e12
)。 换句话说, 42.
是合法的,等于3e2
等于300
。
请注意,如果我们有一个点,我们或者期望它后面跟着更多的数字/指数,或者跟着没有。 但是,这是重要的部分, 点是数字的一部分 。 记住这一点,因为我们看看点运算符obj.prop
是如何处理的。
第11.2.1节“属性访问器”描述了成员访问的点和括号表示法:
MemberExpression . IdentifierName
CallExpression
用于函数调用,我们不关心。 请注意,我们期待的是一个MemberExpression
(可以是一个DecimalLiteral
– 但不要听我的话,看看我是否正确)。
看到那个小点子? 这是合乎逻辑的,他们跳起来说:“好的,这里的计划中有一个小点,而且在… …有一个小点,那么为什么还有一个错误呢?” 唉我的假想的朋友,我用这些句子,你忘了DecimalLiteral
是怎么样的! 我们来看两个例子,看看会发生什么。
42.foo ^
脱字符代表我们正在的angular色。 到目前为止,我们在DecimalLiteral / DecimalIntegerLiteral / NonZeroDigit
(这是相当的一口)。 我们转到下一个angular色:
42.foo ^
仍然是数字的一部分,一个十分有效的DecimalDigit
。
42.foo ^
好的,所以我们不在DecimalIntegerLiteral
部分。 以下是该计划的相同图表:
DecimalIntegerLiteral . DecimalDigits(opt) ExponentPart(opt) ^
所以我们在一个点上,这是一个数字完全有效的部分。 现在我们把它作为数字的一部分 ,然后继续:
42.foo ^
f
既不是DecimalDigits
一部分也不是ExponentPart
,现在我们已经不在数字中了。 所以现在怎么办? 那是什么? 这不是任何事情的一部分。 也许这是一个属性访问器? 让我们来看看这个计划:
MemberExpression . IdentifierName ^
我们肯定是在MemberExpression
,但是我们没有一个跟随它的点 – 那个点已经是数字的一部分了。 我们已经达到了一个语法错误:我们停止执行并抛出它。 希望你不要住在玻璃房子里。
希望现在你明白为什么42..foo
作品。 一旦我们退出MemberExpression
,我们将面临另一个点:
42..foo ^ MemberExpression . IdentifierName ^
随后是完全合法的IdentifierName
。
当然,还有其他几种方法将点与数字分开。 正如你所表明的,一种方法是将括号中的文字括起来: (42).foo
。 当我们到达圆括号的时候,我们已经超出了MemberExpression
的范围。 另一种方法是插入一个空格: 42 .foo
,因为空格不能是数字的一部分,而且对于parsing器来说是中性的,所以不会产生错误。
与Ruby不同(例如),JavaScriptparsing器考虑一个.
以下数字是数字的一部分。 所以parsing器可以看到令牌:
23.
toFixed
(
2
)
这是一个语法错误,因为紧跟在一个浮点数之后的toFixed
这个词是没有意义的。 接受这种语法的Ruby等语言将会看到下列标记:
23
.
toFixed
(
2
)
考虑:
5.
是浮点数字5.
还是整数5
后面跟着一个点? 你不知道; 这是不明确的。 JavaScript采取前者的观点。 在JavaScript的视图中,你已经有了一个浮点数字后跟一个标识符(之后是左括号,数字和右括号)。
有些人用两个点来解决这个问题:
23..toFixed(2)
由于浮点文字只能有一个小数点,所以另一个点是一个文字点标记。