JavaScript 如何处理 ++ 运算符?
-
23-08-2019 - |
题
JavaScript 对对象进行时髦的自动转换:
var o = {toString: function() {return "40"; }};
print(o + o);
print((o+1)+o);
print((o*2) + (+o));
将打印:
4040
40140
120
这是因为,如果任何参数是对象/字符串,+ 将尝试将所有参数转换为字符串,然后连接它们。如果所有参数都是数字,它将它们加在一起。* 和一元 + 使用 toString (以及 valueOf,此处未显示)将对象转换为数字。
JavaScript 对 ++ 运算符有何作用?
解决方案
11.3 后缀表达式
句法
后缀表达式:
- 左手边表达
- LeftHandSideExpression [此处没有 LineTerminator] ++
- LeftHandSideExpression [此处没有 LineTerminator] --
11.3.1 后缀增量运算符
生产 后缀表达式:Lefthandside Expextress [在这里无固定器] ++ 评估如下:
- 评估 LeftHandSideExpression。
- 调用 GetValue(结果(1))。
- 调用 ToNumber(结果(2))。
- 使用与 +运算符相同的规则(第11.6.3节),将值1添加到结果(3)。
- 调用 PutValue(结果(1),结果(4))。
- 返回结果(3)。
这是 postInc 工作原理的伪 javascript 代码:
function postInc(a) {
var x = +a; // Converts a to a number, Section 11.4.6 Unary + Operator
a = x + 1;
return x;
}
编辑:作为 迈克萨缪尔 说:它不是 parseInt。已更新以反映这一点。
其他提示
下面的代码说明了这一良好:
var a = {toString: function() {return "40"; }};
nl(typeof a);
nl(typeof +a);
nl(typeof a);
nl(typeof (a++));
nl(a);
nl(typeof a);
的输出是:
object
number
object
number
41
number
一元加号的对象转换为一个数字,并且不对其进行修改。一个++第一对象转换为一个数字,,然后返回该数,然后然后递增的数量,存储在值。
此相对另一可能的解决方案,其中一个++将第一返回对象,然后执行转换成数字并递增。
在++
操作者做了“toNumber”转换(基本上是的类型的规则组合和的valueOf功能)。基本上任何解决表达
resolveExpression++
由JS引擎所采取的步骤是
<temp> = toNumber(resolveExpression);
resolveExpression = <temp> + 1;
<result> = <temp>
有关非原子解析表达式,例如。 base.resolve++
或base["resolve"]++
等base
解决只有一次,然后再利用。在任何理智情况下,这是无关紧要的,但它是重要的,如果递增的值是与实施的valueOf改变基础对象的对象。
例如
base = {};
base.value = {valueOf:function(){base = {}; return 5;}}
base.value++;
不隶属于 StackOverflow