Javascript JS中的计算顺序

Javascript JS中的计算顺序,javascript,interpreter,Javascript,Interpreter,我所在的大学codeboot.org构建的解释器提供了表达式的逐步执行。因此,我能够看到程序如何读取算术表达式。这就是我开始困惑的地方 例如,此表达式:10-5+(7+2)/3 我们总是说,我们应该计算括号中的表达式,因此,这就是我所期望的顺序 7+2=9,9/3=3,10-5=5,5+3=8 然而,解释器执行的是完全不同的 10-5=5,7+2=9,9/3=3,5+3=8 虽然结果是一样的,但为什么要先计算10-5呢?“我们必须先计算括号里的东西”会发生什么?这让我很困惑 我想知道这是

我所在的大学codeboot.org构建的解释器提供了表达式的逐步执行。因此,我能够看到程序如何读取算术表达式。这就是我开始困惑的地方

例如,此表达式:10-5+(7+2)/3

我们总是说,我们应该计算括号中的表达式,因此,这就是我所期望的顺序

  • 7+2=9,9/3=3,10-5=5,5+3=8
然而,解释器执行的是完全不同的

  • 10-5=5,7+2=9,9/3=3,5+3=8
虽然结果是一样的,但为什么要先计算10-5呢?“我们必须先计算括号里的东西”会发生什么?这让我很困惑

我想知道这是不是正确的行为,解释器总是从左到右,先计算它能计算的东西。在JS中,不要像我们期望的那样直接跳入()中,“先做括号”不是一条规则。“从左到右”也不是真正的规则。例如,考虑<代码> 1 + 4×6 < /代码>。严格的从左到右将导致

  • 1+4=5,5*6=30
这不是JS所做的

相反,JS将表达式解析为表达式树,然后从树的根开始计算。(严格地说,JS实现不需要构建树,但需要给出与构建树相同的结果。)

例如,您的示例表达式
10-5+(7+2)/3
将生成大致如下的树:

AdditiveExpression:
    AdditiveExpression
        AdditiveExpression
            MultiplicativeExpression
                ... NumericLiteral         10

        -                                  -
        MultiplicativeExpression
            ... NumericLiteral             5
    +                                      +
    MultiplicativeExpression
        MultiplicativeExpression
            ... ParenthesizeExpression
                (                          (
                Expression
                   ... AdditiveExpression  7+2
                       
                )                          )
        MultiplicativeOperator             /
        ExponentiationExpression
            ... NumericLiteral             3
其中:

  • 我用缩进来表达嵌套
  • 当我省略了很多中间派生词时,我使用了“…”;及
  • 我还没有费心给出“7+2”的完整子树
(我找不到让codeboot.org显示其解析树的方法。如果有某种方法,或者如果您使用其他工具来显示表达式的解析树,请注意,它的外观可能与上面的不完全相同,但应该足够相似,以使其具有相同的行为。)

要计算表达式,它从根开始,一个
AdditiveExpression
,其子级是:

  • 另一个
    附加表达式
    (对于
    10-5
  • +
    标记,以及
  • a
    乘法表达式
    (对于
    (7+2)/3
规则是

  • (a) 计算左操作数,然后
  • (b) 那么,对吗
  • (c) 对结果执行加法运算
这就是为什么(a)
10-5=>5
是解释器计算的第一件事

接下来是(b)计算
(7+2)/3
的乘法表达式。这里的规则类似,因此我们需要:

  • (b1)计算左操作数(
    (7+2)
    )的乘法表达式),然后
  • (b2)计算右操作数(3的求幂表达式),然后
  • (b3)执行乘法运算符
    /
    指示的操作
所以(b1)
7+2=>9
是下一件事

然后(b2)
3=>3

然后(b3)
9/3=>3

我们现在已经完成了步骤(b),所以我们继续(c)
5+3=>8


这与解释器执行的一系列计算相匹配。

加法也是可传递的。@DanielA.White我怀疑他不需要那个引用,它似乎是解释器的问题,而不是javascript的问题,标题不能正确地表达这个问题。当我看了一眼,我发现帕伦斯和赛区对第一部分没有影响,所以我先打了10-5。。。。。。可能是解释器所做的我发现解释器总是从左到右,然后计算它能首先计算的任何东西。不是我们所想的,而是直接开始计算括号。哦,非常感谢,我应该问她,而不是我的教授,他甚至不能详细解释哈哈。这让一切变得如此清晰!!!!你知道我在哪里可以找到可以显示解析树的解释器吗?因为在你解释之前我甚至不知道这是一个东西,这里不是一个解释器,但它会向你展示,对于给定的JavaScript代码块,15个不同的JavaScript解析器生成的AST(抽象语法树)。(它还支持许多其他语言。)非常感谢!