1

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

var o = {toString: function() {return "40"; }};
print(o + o);
print((o+1)+o);
print((o*2) + (+o));

将打印:

4040
40140
120

这是因为 +,如果任何参数是对象/字符串,将尝试将所有参数转换为字符串,然后将它们连接起来。如果所有参数都是数字,则将它们加在一起。* 和 unary + 使用 toString(以及 valueOf,此处未显示)将对象转换为数字。

JavaScript 对 ++ 运算符有什么作用?

4

3 回答 3

4

来自ECMAScript 语言规范

11.3 后缀表达式

句法

后缀表达式:

  • 左手边表达式
  • LeftHandSideExpression [此处没有 LineTerminator] ++
  • LeftHandSideExpression [这里没有 LineTerminator] --

11.3.1 后缀自增运算符

产生式 PostfixExpression : LeftHandSideExpression [no LineTerminator here] ++评估如下:

  1. 评估 LeftHandSideExpression。
  2. 调用 GetValue(Result(1))。
  3. 呼叫号码(结果(2))。
  4. 使用与 + 运算符相同的规则(第 11.6.3 节)将值 1 添加到 Result(3)。
  5. 调用 PutValue(Result(1), Result(4))。
  6. 返回结果(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;
}

编辑:正如mikesamuel所说:这不是 parseInt。更新以反映这一点。

于 2008-12-22T17:42:59.283 回答
3

下面的代码很好地说明了这一点:

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++ 将首先返回对象,然后转换为数字并递增。

于 2008-12-22T11:38:13.453 回答
1

运算符进行“ ++toNumber”转换(基本上是类型规则和 valueOf 函数的组合)。基本上适用于任何解决表达式

 resolveExpression++

JS引擎采取的步骤是

 <temp> = toNumber(resolveExpression);
 resolveExpression = <temp> + 1;
 <result> = <temp>

对于非原子解析表达式,例如。base.resolve++orbase["resolve"]++base仅解决一次,然后重复使用。在任何理智的情况下,这都是无关紧要的,但是如果要增加的值是一个具有更改基础对象的 valueOf 实现的对象,这一点很重要。

例如。

base = {};
base.value = {valueOf:function(){base = {}; return 5;}}
base.value++;
于 2008-12-22T13:46:12.727 回答