JavaScript如何处理++;操作人员
JavaScript对对象进行时髦的自动转换:JavaScript如何处理++;操作人员,javascript,operators,type-conversion,coercion,Javascript,Operators,Type Conversion,Coercion,JavaScript对对象进行时髦的自动转换: var o = {toString: function() {return "40"; }}; print(o + o); print((o+1)+o); print((o*2) + (+o)); 将打印: 4040 40140 120 这是因为+,如果任何参数是对象/字符串,则会尝试将所有参数转换为字符串,然后将它们连接起来。如果所有参数都是数字,则将它们相加。*和一元+使用toString(以及valueOf,此处未显示)将对象转换为数字
var o = {toString: function() {return "40"; }};
print(o + o);
print((o+1)+o);
print((o*2) + (+o));
将打印:
4040
40140
120
这是因为+,如果任何参数是对象/字符串,则会尝试将所有参数转换为字符串,然后将它们连接起来。如果所有参数都是数字,则将它们相加。*和一元+使用toString(以及valueOf,此处未显示)将对象转换为数字
JavaScript对++操作符有什么作用?下面的代码很好地说明了这一点:
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
一元加号将对象转换为数字,不进行修改。a++首先将对象转换为一个数字,然后返回该数字,然后递增该数字,并将值存储在a中
这与另一种可能的解决方案相反,在这种解决方案中,a++首先返回对象,然后进行数字转换和增量运算。下面的代码很好地说明了这一点:
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
一元加号将对象转换为数字,不进行修改。a++首先将对象转换为一个数字,然后返回该数字,然后递增该数字,并将值存储在a中
这与另一种可能的解决方案相反,在这种解决方案中,++首先返回对象,然后进行数字转换和递增。操作符执行“toNumber”转换(基本上是类型规则和valueOf函数的组合)。基本上适用于任何解析表达式
resolveExpression++
JS引擎采取的步骤如下
<temp> = toNumber(resolveExpression);
resolveExpression = <temp> + 1;
<result> = <temp>
++
运算符执行“toNumber”转换(基本上是类型规则和valueOf函数的组合)。基本上适用于任何解析表达式
resolveExpression++
JS引擎采取的步骤如下
<temp> = toNumber(resolveExpression);
resolveExpression = <temp> + 1;
<result> = <temp>
从
11.3后缀表达式
语法
后固定表达:
- 左手边表情
- LeftHandSideExpression[此处无行终止符]++
- LeftHandSideExpression[此处无行终止符]--
这是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。更新以反映这一点。来自
11.3后缀表达式
语法
后固定表达:
- 左手边表情
- LeftHandSideExpression[此处无行终止符]++
- LeftHandSideExpression[此处无行终止符]--
这是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。更新以反映这一点。不涉及parseInt。它将转换为一个数字,因此结果可能包含小数部分。考虑x=‘4.5’,++x,内部数转换方案将在字符串x= '0xa’,++中识别十六进制。x@Mikesamuel:是的,我的错。它应该是用伪代码写的。。。我现在已经更新了。谢谢你指出这一点。这里不涉及parseInt。它将转换为一个数字,因此结果可能包含小数部分。考虑x=‘4.5’,++x,内部数转换方案将在字符串x= '0xa’,++中识别十六进制。x@Mikesamuel:是的,我的错。它应该是用伪代码写的。。。我现在已经更新了。谢谢你指出这一点。