Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/456.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript如何处理++;操作人员_Javascript_Operators_Type Conversion_Coercion - Fatal编程技术网

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,此处未显示)将对象转换为数字

JavaScript对对象进行时髦的自动转换:

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[此处无行终止符]--
11.3.1后缀增量运算符

生产后固定表达: LeftHandSideExpression[否] 此处的LineTerminator]++已计算 详情如下:

  • 计算LeftHandSideExpression
  • 调用GetValue(结果(1))
  • 调用ToNumber(结果(2))
  • 使用与+运算符相同的规则,将值1添加到结果(3)中 (第11.6.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。更新以反映这一点。

    来自

    11.3后缀表达式 语法

    后固定表达:

    • 左手边表情
    • LeftHandSideExpression[此处无行终止符]++
    • LeftHandSideExpression[此处无行终止符]--
    11.3.1后缀增量运算符

    生产后固定表达: LeftHandSideExpression[否] 此处的LineTerminator]++已计算 详情如下:

  • 计算LeftHandSideExpression
  • 调用GetValue(结果(1))
  • 调用ToNumber(结果(2))
  • 使用与+运算符相同的规则,将值1添加到结果(3)中 (第11.6.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。更新以反映这一点。

    不涉及parseInt。它将转换为一个数字,因此结果可能包含小数部分。考虑x=‘4.5’,++x,内部数转换方案将在字符串x= '0xa’,++中识别十六进制。x@Mikesamuel:是的,我的错。它应该是用伪代码写的。。。我现在已经更新了。谢谢你指出这一点。这里不涉及parseInt。它将转换为一个数字,因此结果可能包含小数部分。考虑x=‘4.5’,++x,内部数转换方案将在字符串x= '0xa’,++中识别十六进制。x@Mikesamuel:是的,我的错。它应该是用伪代码写的。。。我现在已经更新了。谢谢你指出这一点。