有人能解释一下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