当前位置: 首页 > 知识库问答 >
问题:

Javascript增量运算顺序的计算

胥康安
2023-03-14

我知道后缀/前缀递增/递减运算符是做什么的。在javascript中,这似乎没有什么不同。

虽然我可以很容易地猜出这一行的结果:

var foo = 10; console.log(foo, ++foo, foo, foo++, foo); 
// output: 10 11 11 11 12

运算符出现在单独的表达式中时。

由于这些运算符出现在同一个表达式中,因此变得有点复杂:

var foo = 10; console.log(foo, ++foo + foo++, foo);
// output[1]: 10 22 12
// Nothing unexpected assuming LTR evaluation

var foo = 10; console.log(foo, foo++ + ++foo, foo);
// output[2]: 10 22 12
// What? Ordering is now different but we have the same output.
// Maybe value of foo is evaluated lazily...

var foo = 10; console.log(foo, foo + ++foo, foo);
// output[3]: 10 21 11
// What?! So first 'foo' is evaluated before the increment?

我的问题是,Javascript(在本例中为V8,我在Chrome中测试了它们)如何以不同的方式计算第二个和第三个示例中的加法表达式?

为什么foo的评估结果与foo不同。后缀不是应该在表达式之后递增,然后在表达式中计算为foo

共有3个答案

印瑾瑜
2023-03-14

var-foo=10;安慰日志(foo,foo,foo);

++foo + foo++
   11 + 11

预增量将foo设置为11,然后将其再次添加到foo中,该值仍然为11,在foo再次递增之前计算为22。

var foo=10;console.log(foo, foo foo, foo);

foo++ + ++foo
10    +    12

当我们到达foo时,该值已经从foo中被证明有罪

var-foo=10;安慰日志(foo,foo,foo);

foo + ++foo
10  +   11

foo在我们添加到foo之前是递增的,因此我们得到10 11

总结

基本上,这一切都取决于当你把它们加在一起时foo的当前值是多少。

平嘉熙
2023-03-14

请理解,当您使用foo时,您是在告诉“编译器”:在您将其推送到堆栈后,将其递增。当您使用foo时,您告诉的是另一种方式:增加它,然后将它推到堆栈中。运算符优先于,因为“编译器”以这种方式读取表达式(foo)(foo)

黎奇略
2023-03-14

看看:

foo++ + ++foo

精神上重写它:

foo++ →
    addition_lhs = foo  // addition_lhs == 10
    foo += 1            // foo == 11
++foo →
    foo += 1            // foo == 12
    addition_rhs = foo  // addition_rhs == 12

addition_lhs + addition_rhs == 10 + 12 == 22

foo foo

foo →
    addition_lhs = foo  // addition_lhs == 10
++foo →
    foo += 1            // foo == 11
    addition_rhs = foo  // addition_rhs == 11

addition_lhs + addition_rhs == 10 + 11 == 21

所以所有东西都是从左到右计算的,包括增量。

要理解的关键规则是,在JavaScript中,在右手边(RHS)执行任何操作之前,整个左手边(LHS)都会被执行,并且记住值。

您可以通过阅读标准来确认计算顺序,也可以在表达式中放置运行时错误,然后查看发生了什么:

alert(1) + alert(2) + (function () { throw Error(); })() + alert(3)
 类似资料:
  • 本文向大家介绍什么是JavaScript中的增量(++)运算符?,包括了什么是JavaScript中的增量(++)运算符?的使用技巧和注意事项,需要的朋友参考一下 增量运算符将整数值加1。这是一个示例,其中使用递增运算符两次将a的值递增两次 示例

  • void 运算符 void运算符的作用是执行一个表达式,然后不返回任何值,或者说返回undefined。 void 0 // undefined void(0) // undefined 上面是void运算符的两种写法,都正确。建议采用后一种形式,即总是使用圆括号。因为void运算符的优先性很高,如果不使用括号,容易造成错误的结果。比如,void 4 + 7实际上等同于(void 4) + 7。

  • 我在PostgreSQL中有类似的设置。(如果有区别的话,我使用的是运行Mojave的mac)。 我还有几个专栏,但问题是ID专栏。这被设置为连续的,所以使用Express我将其插入到DB中。 问题是,即使插入失败,它也会在每次插入时增加ID<代码>信息定义为唯一的,因此尝试插入现有的信息会返回错误。但是ID仍然是递增的。 例如,如果插入2行,则id为1 我是否可以设置Postgres,使其不会在

  • 增量运算符++将1添加到其操作数,减量运算符 - 从其操作数中减去1。 因此 - x = x+1; is the same as x++; 同样 - x = x-1; is the same as x--; 递增和递减运算符都可以在操作数之前(前缀)或后跟(后缀)。 例如 - x = x+1; can be written as ++x; // prefix form 或者 - x++; /

  • 在Apache Flink中使用滑动时间窗口时,当窗口滑动时会重新计算窗口中的许多元组/元素。例如,假设一个窗口大小为5秒,滑动时间为1秒,则窗口内容的80%与上一个窗口的内容相同。 考虑一个数据流S,其元组由时间戳和整数值组成: , , , , , , ,... 假设t1、t2、t3、...表示连续时间戳,其中t2-t1=1秒。给定S,窗口大小为5秒、滑动1秒的Flink窗口化ProcessWi

  • 问题内容: 当我运行以下示例时,我得到输出0,2,1 我不明白为什么输出是0,2,1而不是0,2,2 问题答案: 意思是现在。调用打印,但返回0,所以和 在此之前,现在想象被调用并替换为0 所以 现在它将是 用简单的话(从这里 @ Piotr) “ i = i ++”大致翻译为 另一个这样的例子: 同样的基本原理