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 循环声明中使用 ++ii++ 确实没有区别。

然后在我们处理的时候抛出 --ii--

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

by ref vs. by val,变量 vs. 数组 [重复]

JavaScript------去掉Array中重复值

VB.NET vs C#整数除法[重复]

JavaScript for循环不重复绑定点击事件

JavaScript:了解 for 循环内的 let 范围 [重复]