调用数字文字的成员函数

时间:2013-09-01 06:27:40

标签: javascript

我正在尝试调用文字函数,但我得到了奇怪的行为。

请考虑此代码返回true

   23 === (23)

当我写作时尝试以下内容。

(23).toFixed(2)

我得到了预期的结果_23.00_,但是当我尝试23.toFixed(2)时,我收到了此错误。

  

SyntaxError:意外的标记ILLEGAL

JavaScript如何评估无法理解的表达式以及为什么会出现此错误?

3 个答案:

答案 0 :(得分:58)

Greg Hewgillicktoofay的答案在所有方面都是正确的,但是,我想要抽象一点,抽象明智:让我们看看根据javascript规范真正发生了什么。

规范的

Section 7.8.3定义了数字文字。我们可以看到以下内容:

DecimalLiteral ::
    DecimalIntegerLiteral . DecimalDigits(opt) ExponentPart(opt)
    . DecimalDigits ExponentPart(opt)
    DecimalIntegerLiteral ExponentPart(opt)

DecimalIntegerLiteral ::
    0 
    NonZeroDigit DecimalDigits(opt)

一个数字DecimalLiteral是一串十进制数字,可能后面跟一个点,后面可能跟着其他数字(所有数字后跟一个指数,e12实例)。换句话说,42.是合法的,等于423e2等于300

注意如果我们有一个点,我们要么预期它会跟随更多的数字/指数,或者后面没有任何数字。但是,这是重要的部分,点是数字的一部分。请记住这一点,我们将着眼于如何处理点运算符obj.prop

Section 11.2.1, Property Accessors描述了成员访问的点和括号表示法:

MemberExpression . IdentifierName

CallExpression用于函数调用,我们不关心。请注意我们如何期待MemberExpression(可以是DecimalLiteral - 但不要接受我的话,看看我是否正确。)

看到那个小点?向前跳并说“好吧,这里的方案中有一个点......在4.foo中有一个点......那么为什么会出现错误?”唉,我用这些句子的假想朋友,你忘记了DecimalLiteral的样子!让我们看看两个例子,看看会发生什么。

42.foo
^

插入符代表我们所处的角色。到目前为止,我们在DecimalLiteral / DecimalIntegerLiteral / NonZeroDigit里面(这是相当满口的)。让我们转到下一个角色:

42.foo
 ^

仍然是数字的一部分,完全有效DecimalDigit

42.foo
  ^
好的,所以我们不在DecimalIntegerLiteral部分。这是该计划的相同图表:

DecimalIntegerLiteral . DecimalDigits(opt) ExponentPart(opt)
                      ^

所以我们在一个点上,这是一个完全有效的数字部分。现在我们使用它,作为数字的一部分,然后继续:

42.foo
   ^

f既不是DecimalDigits也不是ExponentPart的一部分,我们现在已经超出了这个数字。所以现在怎么办?什么是f?这不是任何事情的一部分。也许它是一个属性访问者?我们来看看这个计划:

MemberExpression . IdentifierName
      ^

我们肯定在MemberExpression,但我们没有跟随它的点 - 该点已经是数字的一部分。我们遇到了一个语法错误:我们停止执行并抛出它。希望你不住在玻璃房子里。

希望您现在明白为什么42..foo有效。一旦我们离开MemberExpression,我们就会面临另一个问题:

              42..foo
                 ^
MemberExpression . IdentifierName
                 ^

遵循完全合法的IdentifierName

当然,还有其他几种方法可以将点与数字分开。正如您所示,一种方法是用括号括起文字:(42).foo。当我们到达括号结束时,我们已经离开MemberExpression,并且在点上。另一种方法是插入一个空格:42 .foo,因为空格不能是数字的一部分,而且它对于解析器来说是中性的,所以它不会引发错误。

答案 1 :(得分:34)

与Ruby(例如)不同,Javascript解析器认为.后面的数字是数字的一部分。所以解析器会看到令牌:

23. toFixed ( 2 )

这是一个语法错误,因为紧跟浮点数后面的单词toFixed没有意义。接受此语法的Ruby等语言会看到以下标记:

23 . toFixed ( 2 )

答案 2 :(得分:23)

考虑:

5.

是浮点文字5.还是整数5后跟一个点?你不知道;这是模棱两可的。 JavaScript采用前一种观点。在JavaScript的视图中,您有一个浮点文字后跟一个标识符(然后是左括号,数字和右括号)。

有些人通过使用两个点来解决这个问题:

23..toFixed(2)

由于浮点文字只能有一个小数点,另一个点是文字点标记。