javascript i++ vs ++i [重复]
Posted
技术标签:
【中文标题】javascript i++ vs ++i [重复]【英文标题】:javascript i++ vs ++i [duplicate] 【发布时间】:2011-10-15 14:56:15 【问题描述】:在javascript中我看到i++
在很多情况下被使用,我知道它在前面的值上加了一个:
for (var i=1; i<=10; i++)
console.log(i);
但是当我这样做时会发生什么:
++i;
使用--
运算符有什么不同(当然除了它是减法而不是加法)?
【问题讨论】:
了解 ++i 通常称为 PREFIX 表示法,而 i++ 称为 POSTFIX 表示法可能对您有用。它在许多其他语言中的工作方式相同。 【参考方案1】:++variable
增加变量,返回新值。
variable++
增加变量,但返回旧值。
--variable
递减变量,返回新值。
variable--
递减变量,但返回旧值。
例如:
a = 5;
b = 5;
c = ++a;
d = b++;
a
是 6,b
是 6,c
是 6,d
是 5。
如果您不使用结果,则前缀运算符与后缀运算符的作用相同。
【讨论】:
如果你使用结果作为数组索引,你也可以先将它偏移1,作为前缀=]【参考方案2】:var i = 0;
console.log(i++); // 0
console.log(++i); // 2
【讨论】:
这里最好用两个变量来说明区别。示例不应做多于一件事。【参考方案3】:它决定增量发生在变量值被使用之前还是之后。
var j = 2;
console.log(j++); // 2
console.log(j); // 3
var k = 2;
console.log(++k); // 3
console.log(k); // 3
【讨论】:
【参考方案4】:i++
和++i
的区别在于表达式的值。
i++
的值是i
在增量之前的值。 ++i
的值是i
增加后的值。
例子:
var i = 42;
alert(i++); // shows 42
alert(i); // shows 43
i = 42;
alert(++i); // shows 43
alert(i); // shows 43
i--
和 --i
运算符的工作方式相同。
【讨论】:
在大多数情况下,++i 都稍微快一点。这可能取决于系统,但理论上应该。 jsperf.com/plusplusi-vs-iplusplus @aelgoa:大部分时间差值在margin error之内,其余时间没有一致的结果。如果不使用表达式的值,理论上应该没有区别,因为编译器应该将其优化为相同的操作。 @aelgoa +1,因为这在其他语言中几乎完全覆盖,++i 始终是最佳实践,除非特定语言的性能明显更差。我听说人们认为它可以忽略不计,但并非总是如此。例如,使用服务器端 javascript 不只是生成页面,您很可能会快速循环数百万次。这可以将每个循环的开销减少约 1/2,这对单线循环非常重要。 Guffa 在这里是正确的。 jsperf.com/ppi-vs-ipp-forloop 当我运行这个测试时,它显示 i++ 在 for 循环中更快,但还不够重要。虽然 ++i 在其他语言中可能更快,但我认为可以肯定地说 javascript 将操作优化为相同。【参考方案5】:i++
= 在语句中使用 i 的值然后将其增加 1 ++i
= 将 i 的值增加 1 然后在语句中使用。
【讨论】:
【参考方案6】:为了完整起见,我想添加一个特定于 OP 问题的第一个问题的答案:
您的一个示例显示了在 for 循环中使用的 i++ / ++i :
for (i=1; i<=10; i++)
alert(i);
无论您使用哪一种,您都会在提醒中获得 1-10 个。示例:
console.log("i++");
for (i=1; i<=10; i++)
console.log(i);
console.log("++i");
for (i=1; i<=10; ++i)
console.log(i);
将它们粘贴到控制台窗口中,您可以看到它们都有相同的输出。
【讨论】:
没错,但反过来做:console.log("i--"); for (i=10; i--;) console.log(i); console.log("--i"); for (i=10; --i;) console.log(i); 为什么?在 for 循环中使用 ++i 的能力无疑是理想的行为。【参考方案7】:所有这些答案都没有提到的一种情况是,当i++
和++i
用于其他数字的操作时会发生什么。虽然整个“i++
在之前,++i
在之后”的概念在表达式本身时很容易掌握,但当您开始组合语句时,它会变得更加混乱。请参见下面的示例 C 和 D。
// Example A
var i = 42;
var a = i++; // equivalent to `var a = i; i = i+1;`
console.log(a); // 42
console.log(i); // 43
// Example B
var i = 42;
var b = ++i; // equivalent to `i = i+1; var b = i;`
console.log(b); // 43
console.log(i); // 43
// Example C
var i = 42;
var c = i++ * 2; // equivalent to `var c = i*2; i = i+1;`
console.log(c); // 84
console.log(i); // 43
// Example D
var i = 42;
var d = ++i * 2; // equivalent to `i = i+1; var d = i*2;`
console.log(d); // 86
console.log(i); // 43
请注意,在示例 C 中,i++
直到 乘法和分配 c
后才被计算。这反驳了“i++
应按操作顺序首先评估”的误解。所以换句话说,i++ * 2
语句实际上计算了i * 2
之前 它增加了i
。
【讨论】:
【参考方案8】:++variable
: 使用变量前递增变量variable++
: 使用变量后递增变量
我认为包含一个带有 sn-p 的答案可能会很有用,以确认它们在 for
循环中的行为。
只是为了在您的浏览器中验证在 for 循环声明中使用 ++i
与 i++
确实没有区别。
然后在我们处理的时候抛出 --i
与 i--
。
console.log("-- with looping --");
console.log("using ++i in a for loop");
for (var i=1; i<=3; ++i)
console.log(i);
console.log("using i++ in a for loop");
for (var i=1; i<=3; i++)
console.log(i);
console.log("using --i in a for loop");
for (var i=3; i>=1; --i)
console.log(i);
console.log("using i-- in a for loop");
for (var i=3; i>=1; i--)
console.log(i);
console.log("-- without looping --");
var i = 1;
console.log("i: "+ i);
console.log("i++: "+ i++);
console.log("i: "+ i);
console.log("++i: "+ ++i);
console.log("i: "+ i);
console.log("--i: "+ --i);
console.log("i: "+ i);
console.log("i--: "+ i--);
console.log("i: "+ i);
【讨论】:
以上是关于javascript i++ vs ++i [重复]的主要内容,如果未能解决你的问题,请参考以下文章
JavaScript - For loop vs forEach