javascript - 调用数字字面量的成员函数

标签 javascript

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

考虑这段返回 true 的代码:

23 === (23)

当我写的时候尝试以下操作:

(23).toFixed(2)

我得到了预期的结果 "23.00" 但是当我尝试 23.toFixed(2) 时我得到了这个错误。

SyntaxError: Invalid or unexpected token

为什么会出现此错误?

最佳答案

Greg Hewgill 的答案和 icktoofay在所有方面都是正确的,但是,我想在抽象方面稍微深入一点:让我们看看根据 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 中有一个点……所以为什么会出现错误?”是合乎逻辑的。唉,我假想的 friend ,我用他来写这些句子,你忘记了 DecimalLiteral 是什么样子的!让我们看两个例子,看看会发生什么。

42.foo
^

插入符号代表我们所在的 Angular 色。到目前为止,我们在 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,因为空格不能作为数字的一部分,而且它对解析器是中性的,所以不会引发错误。

关于javascript - 调用数字字面量的成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18555853/

相关文章:

javascript - es6 propertyIsEnumerable

javascript - 在 django 模板中使用 javascript

javascript - React js 改变状态不更新组件

javascript - 单击一个页面时如何更改页面上的所有照片

javascript - 从平滑滚动到正常滚动,反之亦然

javascript - 如何利用JavaScript和Node.js中的事件循环?

javascript - 如何忽略 HTML 表单中的禁用问题,以便我能够在 HTML/JS 应用程序中使用 "Next"按钮进入下一节?

javascript - 在 JS 中动态创建树/嵌套 JSON

javascript - 单击我需要在该特定行的下一列中添加图像的复选框

javascript - 第三个字符后的 Action 键