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.
扩大声明
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)
我没有看到任何令人信服的论据支持或反对这两种选择,所以不幸的是,不同的语言表现不同.
| 归档时间: |
|
| 查看次数: |
1993 次 |
| 最近记录: |