在JavaScript语句中多次修改变量和函数参数的求值顺序
Modifying a variable more than once in a statement and order of evaluation of function arguments in JavaScript
我们如何推断这些JavaScript语句并解释它们的输出?
-
i = 1; i = i++; console.log(i); // Outputs 1 in Firefox
-
i = 1; x = i++ + i++; console.log(i, x); // Outputs 3 3 in Firefox
-
i = 1; console.log(i, i++); // Outputs 1 1 in Firefox
在C中,(1)和(2)的等价语句被认为调用了未定义的行为,因为我们在两个序列点之间多次修改i
的值。在C语言中,(3)的等价语句被认为调用了未定义的行为,因为函数参数的求值顺序是未定义的。JavaScript的规则是什么?
根据ECMA 5.1后缀自增运算符规范,
- 设
lhs
为LeftHandSideExpression
的求值结果。- 设
oldValue
为ToNumber(GetValue(lhs))
- 设
newValue
为oldValue
加1的结果,使用与+运算符相同的规则(见11.6.3)。- 呼叫
PutValue(lhs, newValue)
.- 返回
oldValue
.
根据规则,让我们计算表达式
i = i++
该值将在i
中递增并设置。按照步骤4和步骤5。然后返回oldValue
1本身,并将其再次存储在i
中。这就是为什么你得到1。
x = i++ + i++
相同的逻辑。i++
的值为1
, i
的值为2。现在,计算下一个i++
,它的值为2,i
的值被设置为3。所以1和2的和赋值给x
。这就是为什么它打印3 3
console.log(i, i++)
还是同样的逻辑。i
为1,i++
计算结果为1
,但只设置为2
。这就是为什么它打印1 1
相关文章:
- 函数参数中的数据与指定变量之间的任何性能差异
- AngularJS:我可以跳过函数参数回调吗
- 函数未将值作为参数传递
- JS:检查URL中的参数,然后迭代一个参数为var的函数
- 为什么不'我们在javascript中使用函数参数的数据类型
- 你好,这是测试用例,我必须在函数中传递n个参数
- JavaScript - 多参数函数,它是多个图像库的字符串
- 如何从两个参数函数返回随机整数
- 以无点风格在Ramda中编写一个无参数函数
- JS:将单参数函数转换为可链接函数
- 正则表达式类似于Javascript中的参数函数
- 将 $' 值传递给替换的关联参数函数
- "这个“;在参数函数中
- 如何向jquery插件发送参数函数
- 将参数函数Node.js从一个js传递到另一个js
- 如何在javascript参数函数中传递PHP post方法字符串
- 装饰 Javascript Promise.then 以便参数函数接收附加参数
- 正在分析setInterval ID'是的's参数函数
- 如何根据一个参数函数计算年龄
- 对象参数/函数和/或三元运算符混淆