为什么JavaScript的后缀符号与C和Perl不同?

Mat*_*aly 6 javascript postfix-notation

我正在攻读JavaScript考试.我也对C和Perl有一点了解,所以我熟悉所有三种语言中的前缀和后缀表示法.

我做了一次在线练习考试,我犯的一个错误是评估以下代码:

var x = 10;
x += x--;
Run Code Online (Sandbox Code Playgroud)

现在,我认为它将评估为19,因为它将是10 + 10,然后减去1来制作9.但我得到的反馈是它错了,它实际上评估为20.我认为这听起来有点可疑所以我在HTML文档中测试了它,它再次出现了20.然后我尝试了C和Perl中的等价物,并且都评估为19.

任何人都可以向我解释为什么当其他语言将其评估为19时,JavaScript会将答案评估为20?我从测试中得到的答案对我来说不太清楚:

增量++和减量运算符可以放在操作数之前或之后.如果增量或减量运算符放在操作数之前,则操作立即发生.如果在操作数之后放置递增或递减运算符,则直到下次在程序中访问操作数时,操作数值的更改才会显现.因此,表达式x + = x--等于x = x + 10,其值为20.

Chr*_*oph 6

扩大声明

x += x--;
Run Code Online (Sandbox Code Playgroud)

更详细的JS代码

x = x + (function(){ var tmp = x; x = x - 1; return tmp; })();
Run Code Online (Sandbox Code Playgroud)

结果很有意义,因为它会评估

x = 10 + (function(){ var tmp = 10; x = 10 - 1; return tmp; })();
Run Code Online (Sandbox Code Playgroud)

这是20.请记住,JS从左到右评估表达式,包括复合赋值,即x在执行前缓存的值x--.


您也可以这样想:假设从左到右的评估顺序,JS将分配解析为

x := x + x--
Run Code Online (Sandbox Code Playgroud)

而Perl将使用

x := x-- + x
Run Code Online (Sandbox Code Playgroud)

我没有看到任何令人信服的论据支持或反对这两种选择,所以不幸的是,不同的语言表现不同.