Javascript 这种语法是如何工作的?
这个Javascript 这种语法是如何工作的?,javascript,syntax,Javascript,Syntax,这个(var i=this.length;i--;)语法构造是如何工作的 应该有三个部分吗?在这种情况下是什么 从。在某个点,i将达到0,这是一个假值,循环结束 更具体地说,在多次迭代之后: 它将检查i并获得1 i将递减并变为0 循环将以i==0运行 它将检查i并获得0 i将递减并变为-1 循环将结束 它将i初始化为this.length,并使用条件检查将其递减。当它达到零时,这是一个错误的值,循环停止 但请注意,由于您在检查中递减,循环从this.length-1开始,在0结束。所以它相当于
(var i=this.length;i--;)
语法构造是如何工作的
应该有三个部分吗?在这种情况下是什么
从。在某个点,
i
将达到0
,这是一个假值,循环结束
更具体地说,在多次迭代之后:
- 它将检查
并获得i
1
将递减并变为i
0
- 循环将以
i==0运行
- 它将检查
并获得i
0
将递减并变为i
-1
- 循环将结束
i
初始化为this.length
,并使用条件检查将其递减。当它达到零时,这是一个错误的值,循环停止
但请注意,由于您在检查中递减,循环从this.length-1开始,在0结束。所以它相当于:
erase: function(item){
for (var i = this.length; i--;) {
if (this[i] === item) this.splice(i, 1);
}
return this;
}
但是请不要使用这种语法,因为它的行为令人困惑——正如您可能已经注意到的那样。C类语言中的for
循环由三部分组成:
(初始值设定项;
条件;
更新){…}
然后将循环转换为以下(大致)等效循环(存在差异,但此处不相关):
初始值设定项代码>
while
(条件){
…
更新;
}
所以初始化器部分首先运行;然后,只要条件保持为真,循环就会运行,并且在每次迭代结束时,更新部分就会运行。它不必是增量,但最常见的形式如下所示:
(var i = this.length - 1; i >= 0; i--)
for(var i=0;i
但是,您可以将您想要的任何内容写入这些部分,如果您在循环中所做的任何操作都足以使循环正确运行并终止,那么您也可以将它们保留为空。因此,在您的例子中,由于i--
是一个也会更新i
的表达式,因此循环只会将条件和更新组合成一个,然后倒计时。或否<代码>for(;)
提供了一个无限循环。耶+就在我开始写我自己的长答案之前,我发了一篇帖子。请注意,在JavaScript中,所有3个部分都是表达式(从解释角度看,这并没有多大区别)ఠ_ఠ: 谢谢,我更新了。我对JS几乎一无所知,所以我希望Andy能原谅我在这里的技术错误:-)事实上,你称之为增量是对的。至少规范中是这样的。但是我同意NullUserExpection,这个名称不一定有用。不是很相关,但它是一个坏的O(n**2)循环,其中存在一个平凡的O(n)解决方案。循环停止在0
,但后减运算符将I
保留在-1
中,在for
语句之后。@Ӫ,变量i
存在于循环外。@NullUserExceptionఠ_ఠ, 我坚持我的立场。我没有说(更准确地说)循环的停止条件是I==-1
,我说一旦循环停止I
,它的值是-1,这不是第一句话的意思i
的值是不相关的,相关的是在条件下计算的值,这肯定不是i
的值。@davin我不明白你的意思。导致循环停止的原因是i
到达0
。因为您使用的是后减量,所以它仅在之后变为-1
。在循环体中,i
从来都不是-1
@NullUserExceptionఠ_ఠ, 我指的是原来的措辞(甚至我读得有点匆忙)。因为答案已经更新了,所以不是很重要。
for (var i = 0; i < something; i++) { ... }