我知道后缀/前缀递增/递减运算符是做什么的。在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
?
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的当前值是多少。
请理解,当您使用foo
时,您是在告诉“编译器”:在您将其推送到堆栈后,将其递增。当您使用foo
时,您告诉的是另一种方式:增加它,然后将它推到堆栈中。运算符优先于
,因为“编译器”以这种方式读取表达式
(foo)(foo)
看看:
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 ++”大致翻译为 另一个这样的例子: 同样的基本原理