【问题标题】:JavaScript order of operations - parentheses are not evaluated before post-increment operatorJavaScript 操作顺序 - 在后增量运算符之前不计算括号
【发布时间】:2018-10-09 18:13:37
【问题描述】:

示例 1:

var a = 0;
var b = 1;
a = (b++);
console.log(a);

a 等于 1 相同,带或不带括号。示例 2:

var a = 0;
var b = 1;
a = b++;
console.log(a);

我理解第二个例子。 b 分配给a,然后递增为2。但是在第一个示例中,为什么括号不强制 b 在将值分配给 a 之前递增到 2,因为括号具有最高的运算符优先级?谢谢。

【问题讨论】:

标签: javascript post-increment operator-precedence


【解决方案1】:

我理解第二个例子。 b 分配给a,然后递增到2

不完全是。省略一些细节,它是:

  1. 读取b (1) 的值并放在一边。
  2. b 增加到2
  3. b++ 表达式的结果设为步骤#1 中留出的值(值1)。
  4. 将第 3 步的结果分配给a

...这就是() 没有任何区别的原因。 :-) b++ 表达式的结果只是作为分组运算符 (()) 的结果传播。

the spec 中的详细信息。

【讨论】:

  • 感谢您的回答!说 (b++) 评估为 b++ 是否也准确? (而不是我的阅读方式……括号迫使 b++ 实际上返回 2 的值)??
  • @LisaFriedrichsen:是的,没错。当您在单个表达式周围使用分组运算符时,分组运算符的结果始终是该表达式的结果。在您的情况下,b++ 是整个右侧的唯一表达式,因此 () 没有效果(而--据我所知,从问题中--有时() 可能很重要,如a = (b + 2) * 10)。 :-)
  • (实际上,在顶层,分组运算符总是围绕一个表达式。:-) 但是你明白我的意思......)
【解决方案2】:

T.J.的解释对正在发生的事情的理论水平来说是一个很好的解释,但这是从不同角度(比理论更实际)的另一种解释:

我们有两个相似的表达式b++++b。两者都表示b = b + 1,但它们的工作方式不同。

b++ 计算为 b 的当前值(即 1),然后将其递增。相当于:

var a = 0;
var b = 1;
a = b;
b = b + 1; //(b + 1) makes no difference
console.log(a);

++b 做相反的事情,增加b,然后计算增加的​​值。相当于:

var a = 0;
var b = 1;
b = b + 1; //(b + 1) makes no difference
a = b;
console.log(a);

现在,请注意,在上述任何示例中,在 b + 1 周围添加括号不会产生任何影响,因为分配 a = b 是在不同的步骤中完成的。同样,给b++ 添加括号不会有任何区别,因为分配给a 和定罪是在两个不同的步骤中完成的。

但是,b++ 周围的括号实际上等同于上面代码中 a = b 行上 b 周围的括号,而不是您似乎从问题中想到的 b + 1 周围的括号。很明显,括号a = (b) 没有任何区别。

编辑正如您在评论中所建议的,如果我们将b++ 视为一个隐式函数,那么该函数的主体类似于 T.J. 的解释:

  1. 保存b(1)的值,假设是一个隐式变量x
  2. b 增加到 2
  3. 并返回x

在函数调用周围加上括号就像把它们放在返回值 1 周围。这是一个演示:

var a = 0;
var b = 1;
a = bPlusPlus(); //(bPlusPlus()) makes no difference
console.log(a);

function bPlusPlus() {
  var x = b;
  b = b + 1;
  return x;
}

【讨论】:

  • 谢谢。我认为对隐式函数返回的清晰解释在这里会有所帮助。 b++ 返回 1。++b 返回 2,这就是括号中的内容,对吗?但无论哪种情况,在随后的语句中,b 现在都等于 2。
  • 嗯,这是一种有趣的看待方式。当然,您也可以这样想,但括号中的内容是原始值 1,而不是 2(尽管这两种情况都不会产生任何影响)。隐式函数的主体类似于 T.J. 的解释。请参阅我的答案中的编辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-14
  • 2011-03-12
  • 2016-02-02
  • 2018-09-13
  • 2014-01-30
相关资源
最近更新 更多