Javascript 理解递增

Javascript 理解递增,javascript,operators,Javascript,Operators,例如: var a = 123; var b = a++; 现在a包含124和b包含123 我知道b取a的值,然后a递增。然而,我不明白为什么会这样。JavaScript的创建者希望这样做的主要原因是。除了让新手感到困惑之外,这还有什么好处?请注意,您也可以编写 b = ++a; 这可能会产生你预期的效果 重要的是要意识到这里有两件事:赋值和增量,语言应该定义它们发生的顺序。由于我们既有++a又有a++,因此它们应该有不同的含义 对于我们这些C语言背景的人来说,这是很自然的。如果PHP的行为

例如:

var a = 123;
var b = a++;
现在
a
包含
124
b
包含
123


我知道b取a的值,然后a递增。然而,我不明白为什么会这样。JavaScript的创建者希望这样做的主要原因是。除了让新手感到困惑之外,这还有什么好处?

请注意,您也可以编写

b = ++a;
这可能会产生你预期的效果

重要的是要意识到这里有两件事:赋值和增量,语言应该定义它们发生的顺序。由于我们既有
++a
又有
a++
,因此它们应该有不同的含义


对于我们这些C语言背景的人来说,这是很自然的。如果PHP的行为不同,我们可能想知道为什么PHP选择偏离我们习惯的方式。

在许多语言中,增量后和增量前是常见的运算符,Javascript距离第一个大约30年。PHP也支持后期增量。

++
可以像在您的示例中一样用作后期增量运算符,或者如果在变量之前使用,则可以用作前置增量运算符

var b = ++a;

然后首先将变量
a
递增,然后将递增的值分配给
b

这是执行此操作的标准方法。postincrement运算符指定值,然后递增

preincrement(
++a
)运算符递增,然后赋值


我不熟悉php,也说不出它是如何工作的或为什么。

当您将
++
放在变量后面时,它在赋值后会递增。您还可以将
++
放在变量之前,并在赋值之前递增


Javascript实际上在前缀和后缀递增方面的行为与PHP完全相同。

这就是它被称为“后递增运算符”的原因。本质上,一切都是一个表达式,它产生一个值
a+1
是一个表达式,其结果为值124。如果使用
b=a+1
将其分配给
b
b
的值为124。如果您没有将结果分配给任何对象,
a+1
仍将产生值124,它将立即被丢弃,因为您没有在任何地方“捕获”它

顺便说一句,偶数
b=a+1
是一个返回124的表达式。赋值表达式的结果值就是赋值。这就是为什么
c=b=a+1
能像您预期的那样工作

无论如何,
++
--
表达式的特殊之处在于,除了返回值之外,
++
操作符还直接修改变量。因此,当执行
b=a++
时,表达式
a++
返回值123并递增
a
post递增先返回值,然后递增,pre递增
++a
首先递增,然后返回值。如果您只是自己编写了一个+++而没有赋值,您不会注意到其中的区别。这就是
a++
通常的用法,作为
a=a+1
的缩写


这是非常标准的。

++
在变量调用之前pre increment意味着在执行语句之前增加变量的值。
++
after变量称为post increment意味着在执行语句后增加变量的值

两者都增加变量的值

var b = ++a;
$b=$a++相当于

$b=$a;//after
$a=$a+1;
$a=$a+1;//before
$b=$a;
$b=+$a`相当于

$b=$a;//after
$a=$a+1;
$a=$a+1;//before
$b=$a;
另一个例子

$a=5;
echo $a++;//prints 5;

$a=5;
echo ++$a;//prints 6;

Javascript和PHP在增量运算符的行为上没有区别。尽管您可能是用Javascript编写的,但这种行为与大多数(任何?)C风格语言相同。感谢大家的回复。所以这一定与面向对象编程有关。在使用PHP这么长时间之后,以过程的方式,我开始期望,每当变量位于任何运算符的左侧时,它将始终保持其先前的值,除非它被直接重新赋值。对我来说,这是一种完全不同的思维方式,我现在必须习惯这种思维方式。@Chad实际上不,它与面向对象无关。PHP的行为方式与此完全相同。这是关于产生值的表达式。抓起PHP部分,我已经测试过了,事实上它的行为也是一样的。回答得好。我的想法是:为什么如果a=2,b=a+1,我们得到b=3,而a保持其原始值。但在编程语言中,自动增量是一个特殊的特性,它不仅仅意味着添加1,这也是我困惑的地方,但现在我明白了。