递增运算符与循环中的 i + 1
increment operator vs. i + 1 in loop
let eachScore = [10, 20, 30, 40, 50];
let numOfScores = eachScore.length;
let roundNum = 0;
let msg = '';
// if i change (i + 1) to i++, the loop doesn't work as expected
for (i = roundNum; i < numOfScores; i++) {
msg += 'Round' + (i + 1) + ': ' + eachScore[i] + '<br/>';
}
document.querySelector("#round").innerHTML = msg
<div id="round"></div>
这是我写的代码。
我明白为什么 i++
无法正常工作 。
循环每次遇到 i++ 时都会增加 i,但不会增加 (i + 1)。
我不明白为什么 i++ 和 (i + 1) 不一样。为什么 (i + 1) 不像 i++ 那样递增?
我看到了增量运算符的定义。它只是说增量运算符向其操作数和 returns 添加一个值,这似乎是说 i++ 与 (i + 1)...
相同
(i+1)
是一个数字。它返回 Whatever i is
加 1。
i++
是一个变元。它将 i
设置为 Whatever I is
加上 1
。
根据@Samathingamajig:
"i++ mutates i as i = i + 1. but the value returned from it was the
previous value of i, so it is a bit different from i = i + 1. ++i does
the same mutation but returns the new value of i."
迭代发生了太多,开发人员发现 shorthand 很容易,但您应该始终将 i++
视为与 i=i+1
相同
For
循环通常遵循以下格式:
for(condition that needs to be met
;end condition of loop
;What to do at the end of each loop
)
在你的例子中,你说 What to do at the end of each loop
是 Set i to whatever i is plus 1
你是对的。 ++A 的 MDN 文档说
The increment operator (++) increments (adds one to) its operand and returns a value.
不幸的是,它没有阐明发生了什么以及为什么使用“pre”(或“post”)来限定“increment”。
变量预自增就是从内存中获取变量的值,加一,结果存回内存,return加法结果作为预自增的结果操作员。之所以称为“预”增量,是因为增量发生在 return 将变量的更新值传递给程序之前。
相比之下,post 递增变量意味着从内存中获取变量的当前值,复制它(可能在 CPU 寄存器中),递增该值并将其保存回内存中 - 然后 return 变量在添加之前的复制值。它称为“post”增量,因为在将值 return 传递给程序后发生增量。
当然,(i+1)
只是获取i
的值,对其加一,return是表达式的结果,而不更新i
的值.
更精确的 MDN 文章版本可以在词汇表中包含“l-value”,并按照以下行描述运算符:
递增运算符 (++) 是一元赋值运算符,它在存储中递增其操作数并 returns 结果。操作数必须是 l-value.
如果++
用作前缀运算符,则操作数的增量值return作为运算结果。
如果 ++
用作 postfix 运算符,则操作数在递增之前的值将 returned 作为运算结果。
let eachScore = [10, 20, 30, 40, 50];
let numOfScores = eachScore.length;
let roundNum = 0;
let msg = '';
// if i change (i + 1) to i++, the loop doesn't work as expected
for (i = roundNum; i < numOfScores; i++) {
msg += 'Round' + (i + 1) + ': ' + eachScore[i] + '<br/>';
}
document.querySelector("#round").innerHTML = msg
<div id="round"></div>
这是我写的代码。
我明白为什么 i++
无法正常工作 。
循环每次遇到 i++ 时都会增加 i,但不会增加 (i + 1)。
我不明白为什么 i++ 和 (i + 1) 不一样。为什么 (i + 1) 不像 i++ 那样递增?
我看到了增量运算符的定义。它只是说增量运算符向其操作数和 returns 添加一个值,这似乎是说 i++ 与 (i + 1)...
相同(i+1)
是一个数字。它返回 Whatever i is
加 1。
i++
是一个变元。它将 i
设置为 Whatever I is
加上 1
。
根据@Samathingamajig:
"i++ mutates i as i = i + 1. but the value returned from it was the previous value of i, so it is a bit different from i = i + 1. ++i does the same mutation but returns the new value of i."
迭代发生了太多,开发人员发现 shorthand 很容易,但您应该始终将 i++
视为与 i=i+1
For
循环通常遵循以下格式:
for(condition that needs to be met
;end condition of loop
;What to do at the end of each loop
)
在你的例子中,你说 What to do at the end of each loop
是 Set i to whatever i is plus 1
你是对的。 ++A 的 MDN 文档说
The increment operator (++) increments (adds one to) its operand and returns a value.
不幸的是,它没有阐明发生了什么以及为什么使用“pre”(或“post”)来限定“increment”。
变量预自增就是从内存中获取变量的值,加一,结果存回内存,return加法结果作为预自增的结果操作员。之所以称为“预”增量,是因为增量发生在 return 将变量的更新值传递给程序之前。
相比之下,post 递增变量意味着从内存中获取变量的当前值,复制它(可能在 CPU 寄存器中),递增该值并将其保存回内存中 - 然后 return 变量在添加之前的复制值。它称为“post”增量,因为在将值 return 传递给程序后发生增量。
当然,(i+1)
只是获取i
的值,对其加一,return是表达式的结果,而不更新i
的值.
更精确的 MDN 文章版本可以在词汇表中包含“l-value”,并按照以下行描述运算符:
递增运算符 (++) 是一元赋值运算符,它在存储中递增其操作数并 returns 结果。操作数必须是 l-value.
如果
++
用作前缀运算符,则操作数的增量值return作为运算结果。如果
++
用作 postfix 运算符,则操作数在递增之前的值将 returned 作为运算结果。