i-- 和 i = i-1 的评估不一样
i-- and i = i-1 not evaluating the same
我以为i--
是i = i - 1
的简写,但我发现两者的计算不同:
var i = 1;
while (i = i - 1) {…}
在这种情况下,i
是0
,其计算结果为 false
。这按预期工作。
var i = 1;
while (i--) {…}
i
应该0
并评估false
,但事实并非如此。它的计算结果为 true
。这是一个错误,还是有原因?
当你执行i--
时,i
的值被使用,然后递减。但是在前缀--1
运算符的情况下,它是不同的,例如,它将被递减然后使用。
var i = j = 1;
console.log(i--); // still 1
console.log(i); // now 0
console.log(--j) // 0
console.log(j); // again 0
为什么要解释上述内容?
向您展示使用pre-fix和post-fix运算符时实际上发生了什么,虽然它主要不关心这个问题,但我认为最好知道一下。
现在实际答案
i = i - 1
所做的是一旦遇到代码就会进行评估,所以i
实际上是0
,在这种情况下,你可以说它的行为类似于前缀递减运算符,但是当第一次计算while
中使用的条件时,i--
仍然是1
,然后在第二次检查while
条件时, 它是0
,这是假的,因此循环结束。
只有在计算循环条件之后,但在循环中的语句之前,才会计算i--
。这是递减后缀运算符。这意味着最初对循环条件中的条件的评估将是true
。这将触发循环主体中语句的执行。当循环主体中的语句将被执行时,由于i
已递减 1,因此它将等于 0。因此,循环条件的评估将被false
,循环主体中的语句将不会再次执行。
您应该使用 --i
作为递减前运算符。
在此处查看文档
i--
在循环中使用时与 i=i-1
不同。
i--
将在条件之后但在运行循环内容之前进行评估,而i=i-1
将在条件之前进行评估,因此计算结果为 false。
我想在这方面--i
更类似于i=i-1
,因为它也是在条件之前进行评估的。
你可以想到
while (i--) {...}
相当于
while (i = i - 1, i + 1) {...}
相关文章:
- 为什么'这两根绳子不一样吗
- jQuery的工作方式不一样
- 使用条件函数的Jquery ReplaceWith()的行为与我预期的不一样
- 为什么两个“这个”不一样
- Function.length和this.length不一样.为什么
- IE DIV悬停区域不一样.直到我添加背景颜色
- 评估不将字符串数组计算到数组中
- 评估不使用变量
- i-- 和 i = i-1 的评估不一样
- Wagerfield'的例子看起来和来源不一样
- 鼠标下移页面X,页面Y和鼠标移动页面X后页面Y不一样,随机发生
- 如何为谷歌柱状图上色'it’每个酒吧都不一样,保持原样
- JS提交和HTML提交不一样
- 为什么我的浏览器指纹不一样
- jQuery加载