有人能解释一下javascript算术表达式是如何工作的吗?

有人能解释一下javascript算术表达式是如何工作的吗?,javascript,arithmetic-expressions,Javascript,Arithmetic Expressions,让我们评估一下交换两个变量的代码: var a = 5, b = 3; a = ( a -( b = ( a = a+b ) - b ) ); 我希望a的新值应该是3,b的值应该是5。但是我得到的值是a=0和b=5 我阅读了EcmaScript算术表达式,发现它将从左到右求值。(但不完全清楚) 所以我试了这个 var a = 5, b = 3; a = ( ( b = ( a = a+b ) - b ) - a ); 现在我得到了a=-3和b=5。谁能解释一下为什么会这样 var a =

让我们评估一下交换两个变量的代码:

var a = 5, b = 3; 
a = ( a -( b = ( a = a+b ) - b ) );
我希望
a
的新值应该是
3
b
的值应该是
5
。但是我得到的值是a=0和b=5

我阅读了EcmaScript算术表达式,发现它将从左到右求值。(但不完全清楚)

所以我试了这个

var a = 5, b = 3; 
a = ( ( b = ( a = a+b ) - b ) - a );
现在我得到了
a=-3和b=5
。谁能解释一下为什么会这样

var a = 5, b = 3;
a = ( ( b = ( a = a+b ) - b ) - a );
它将以这种方式运行

a = a + b //8
b = a - b //8-3=5
a = b - a //5-8=-3
它将以这种方式运行

a = a + b //8
b = a - b //8-3=5
a = b - a //5-8=-3

正如您所说,表达式是从左到右求值的,这意味着第一次遇到a时,它的值仍然是5。这归结为:

var a = 5, b = 3; 
a = ( a -( b = ( a = a+b ) - b ) );
a = 5 - (b = (a=(5+3)) - b);
a = 5 - (b = 8 - b);
a = 5 - 5; AND b = 5
在第二种情况下,a值在赋值后求值,因为它位于右侧

var a = 5, b = 3;
a = ( ( b = ( a = a+b ) - b ) - a );
a = ( ( b = 8 - b ) - a ); AND a = 8
a = ( 5 - 8 ); AND a = 8; AND b = 5;
a = - 3;
这一切都归结为操作数的求值顺序

通常在第一种情况下,a的值计算为5,然后计算
b=(a=a+b)-b
,并且仅在计算期间a的值发生变化,但不进行后端口

在第二个示例中,首先计算
(b=(a=a+b)-b)
,将a值更改为8,然后计算a,发现a为8

一个更简单的例子是:
a
求值为5,然后
(a=2)
求值为2,a设置为2,然后
5+2
求值,a设置为7

另一方面:

var a = 5
a = (a = 2) + a
// a = 4

(a=2)
求值为2,a设置为2,然后
a
求值为2,然后
2+2
求值,a设置为4

正如您所说,表达式是从左到右求值的,这意味着第一次遇到a时,其值仍然是5。这归结为:

var a = 5, b = 3; 
a = ( a -( b = ( a = a+b ) - b ) );
a = 5 - (b = (a=(5+3)) - b);
a = 5 - (b = 8 - b);
a = 5 - 5; AND b = 5
a = ( a -( b = ( a = a+b ) - b ) ) 
在第二种情况下,a值在赋值后求值,因为它位于右侧

var a = 5, b = 3;
a = ( ( b = ( a = a+b ) - b ) - a );
a = ( ( b = 8 - b ) - a ); AND a = 8
a = ( 5 - 8 ); AND a = 8; AND b = 5;
a = - 3;
这一切都归结为操作数的求值顺序

通常在第一种情况下,a的值计算为5,然后计算
b=(a=a+b)-b
,并且仅在计算期间a的值发生变化,但不进行后端口

在第二个示例中,首先计算
(b=(a=a+b)-b)
,将a值更改为8,然后计算a,发现a为8

一个更简单的例子是:
a
求值为5,然后
(a=2)
求值为2,a设置为2,然后
5+2
求值,a设置为7

另一方面:

var a = 5
a = (a = 2) + a
// a = 4
(a=2)
求值为2,a设置为2,然后
a
求值为2,然后
2+2
求值,a设置为4

a = ( a -( b = ( a = a+b ) - b ) ) 
与此类似

a = ( 5 -( b = ( a = 5+3 ) - 3 ) ) // a = 8
// a = ( 5 - ( b = 8 - 3 ) ) // b = 5
// a = ( 5 - 5 ) // a = 0
这意味着它将用相同的初始值一次性替换=左侧的a和b, 这和这个序列不一样

a = a+b; // a = 8
b = a-b; // b = 5
a = a-b; // a = 3
如你所料

与此类似

a = ( 5 -( b = ( a = 5+3 ) - 3 ) ) // a = 8
// a = ( 5 - ( b = 8 - 3 ) ) // b = 5
// a = ( 5 - 5 ) // a = 0
这意味着它将用相同的初始值一次性替换=左侧的a和b, 这和这个序列不一样

a = a+b; // a = 8
b = a-b; // b = 5
a = a-b; // a = 3

正如你所料。

这是解释,我希望它是清楚的,因为它不是那么明显。 JS和所有其他语言创建一个树来计算表达式。树根据每个操作员的位置和支架为其指定权重

首先,以下是JS处理表达式的步骤:

Step 0. a = ( a - ( b = ( a = a+b ) - b ) );   a=5, b=3
Step 1.                   a = a+b              a=8, b=3
Step 2.             b = a - b                  a=8, b=5 
Step 3. a = a - b                              a=0, b=5
    =
  /   \
 a     - 
     /    \
   a       =
          /  \   
         b    -            
             / \
            =   b
           /  \
          a    +
              / \
             a   b
在每个步骤中,它处理一个操作员

这是它根据您的表达式创建的树:

Step 0. a = ( a - ( b = ( a = a+b ) - b ) );   a=5, b=3
Step 1.                   a = a+b              a=8, b=3
Step 2.             b = a - b                  a=8, b=5 
Step 3. a = a - b                              a=0, b=5
    =
  /   \
 a     - 
     /    \
   a       =
          /  \   
         b    -            
             / \
            =   b
           /  \
          a    +
              / \
             a   b

然后从下到上对树进行处理。

下面是解释,我希望它是清楚的,因为它不是那么明显。
var a = 5, b = 3; 
a = ( a -( b = ( a = a+b ) - b ) );
JS和所有其他语言创建一个树来计算表达式。树根据每个操作员的位置和支架为其指定权重

首先,以下是JS处理表达式的步骤:

Step 0. a = ( a - ( b = ( a = a+b ) - b ) );   a=5, b=3
Step 1.                   a = a+b              a=8, b=3
Step 2.             b = a - b                  a=8, b=5 
Step 3. a = a - b                              a=0, b=5
    =
  /   \
 a     - 
     /    \
   a       =
          /  \   
         b    -            
             / \
            =   b
           /  \
          a    +
              / \
             a   b
在每个步骤中,它处理一个操作员

这是它根据您的表达式创建的树:

Step 0. a = ( a - ( b = ( a = a+b ) - b ) );   a=5, b=3
Step 1.                   a = a+b              a=8, b=3
Step 2.             b = a - b                  a=8, b=5 
Step 3. a = a - b                              a=0, b=5
    =
  /   \
 a     - 
     /    \
   a       =
          /  \   
         b    -            
             / \
            =   b
           /  \
          a    +
              / \
             a   b
然后从下到上处理该树

var a = 5, b = 3; 
a = ( a -( b = ( a = a+b ) - b ) );
1) a=a(5)-(表达式的其余部分,其中2部分将很快计算)

2) b=(a=a+b//,它仍然没有被计算)-b(这是3,因为新的b还没有改变)

3) a=5(a)+3(b)=8

4) b(我们回到第2点)=8(新a)-3(旧b)=5

5) a(点1)=5(旧a)-5(新b)=0

新a=0,新b=5

var a = 5, b = 3; 
a = ( ( b = ( a = a+b ) - b ) - a );
1) b=(a=a+b)-3(b)

2) a=5(a)+3(b)=8

3) b=8(新a)-3(旧b)=5

4) a(决赛)=5(新b)-8(新a)=-3

新a=-3,新b=5

var a = 5, b = 3; 
a = ( ( b = ( a = a+b ) - b ) - a );
我希望它是可读的:D

1) a=a(5)-(表达式的其余部分,其中2部分将很快计算)

2) b=(a=a+b//,它仍然没有被计算)-b(这是3,因为新的b还没有改变)

3) a=5(a)+3(b)=8

4) b(我们回到第2点)=8(新a)-3(旧b)=5

5) a(点1)=5(旧a)-5(新b)=0

新a=0,新b=5

var a = 5, b = 3; 
a = ( ( b = ( a = a+b ) - b ) - a );
1) b=(a=a+b)-3(b)

2) a=5(a)+3(b)=8

3) b=8(新a)-3(旧b)=5

4) a(决赛)=5(新b)-8(新a)=-3

新a=-3,新b=5

var a = 5, b = 3; 
a = ( ( b = ( a = a+b ) - b ) - a );

我希望它是可读的:D

为什么a=(a-(b=(a=a+b)-b));给了我
a=0和b=5
是的,我最好的猜测是a在表达式(a=a+b)之前被设置为5,所以a保持为5。为什么a=(a-(b=(a=a+b)-b));给了我
a=0和b=5
是的,我的最佳猜测是a在表达式(a=a+b)之前被设置为5,因此a保持为5。但是,在第三步
a=a-b
应该给我的结果是
a=3和b=5
。不是吗?因为步骤2将
a和b的值更改为
a=8和b=3
。我有点困惑看看我的答案:。@KLiFF没有提到的是,对于赋值,第一步是右侧的表达式求值。因此,a=(a-(b=(a=a+b)-b))变成a=(5-(b=(a=5+3)-3))。然后,右边,从内侧到外侧,a=5+3,a beco