这个 for 循环条件是如何工作的?
How does this for loop condition work?
下面的代码示例来自Eloquent Javascript第4章练习4.3(列表)。
为什么下面代码中的for循环在中间条件处停止
for 循环是 "node"?
function listToArray(list) {
array = [];
for (var node=list; node; node = node.rest)
array.push(node.value);
return array;
}
list = { value: 10, rest: { value: 20, rest: { value: 30, rest: null } } };
console.log(listToArray(list));
你可以更好地使用 for..of 循环:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...of
首先我们可以用不同的方式编写程序,这样会更容易理解
function listToArray(list) {
array = [];
for (var i=list;i; i = i.rest)
{
array.push(i.value);
alert(array)
}
}
var listobject = { value: 10, rest: { value: 20, rest: { value: 30, rest: null } } };
listToArray(listobject);
这里的 listobject 是一个 object literal 并且使用 for 循环我们遍历对象字面量的值,或者对象字面量的属性。
我们可以把每一行代码都取下来
1) listToArray(listobject);
这是函数调用,这里我们将对象作为参数传递给函数。
2) 当这段代码执行时,控制转到函数定义
function listToArray(list) { ...}
这里的 list 与我们在函数调用时传递的参数相同。
3) array = [];
在我们声明数组的函数内部,最初数组没有元素。
4)接下来是我们的for循环。 for (var i=list;list; i = i.rest)
内部循环首先我们分配 var i=list;
意味着我们将对象列表的所有 属性 分配给 i
这意味着我们可以通过 i
,
访问每个 属性 对象
示例:
i.value will result 10
5) 这里的下一个条件语句是 i
而在你的程序中是 node
在这种情况下都具有相同的含义:
当 i
为空时,条件将为假,在您的情况下 node
为空。
6)i=i.rest
它将给出对象的属性或对象的值。
示例:listobject.value will result 10
listobject.rest.value will result 20
listobject.rest.rest.value will result 30
7) 最后 array.push(i.value);
将值添加到我们的数组中,我们的数组中包含 10,20,30
我有你同样的问题:我不清楚,我希望作为一本学习 JavaScript 的书,它会得到更好的解释。然后我停下来思考,并考虑了以下问题。
作者的"fault",恕我直言,在于一个简单的事情:与其简单地将node
写成他本可以写成node != null
的第二个语句,那会更突出且易于教学("do the loop while node is not null":并且由于 node
仅在最后一次迭代中为空 - 然后返回 false
- 它会停在那里):试试你自己,这有效
下面的代码示例来自Eloquent Javascript第4章练习4.3(列表)。
为什么下面代码中的for循环在中间条件处停止 for 循环是 "node"?
function listToArray(list) {
array = [];
for (var node=list; node; node = node.rest)
array.push(node.value);
return array;
}
list = { value: 10, rest: { value: 20, rest: { value: 30, rest: null } } };
console.log(listToArray(list));
你可以更好地使用 for..of 循环: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...of
首先我们可以用不同的方式编写程序,这样会更容易理解
function listToArray(list) {
array = [];
for (var i=list;i; i = i.rest)
{
array.push(i.value);
alert(array)
}
}
var listobject = { value: 10, rest: { value: 20, rest: { value: 30, rest: null } } };
listToArray(listobject);
这里的 listobject 是一个 object literal 并且使用 for 循环我们遍历对象字面量的值,或者对象字面量的属性。
我们可以把每一行代码都取下来
1) listToArray(listobject);
这是函数调用,这里我们将对象作为参数传递给函数。
2) 当这段代码执行时,控制转到函数定义
function listToArray(list) { ...}
这里的 list 与我们在函数调用时传递的参数相同。
3) array = [];
在我们声明数组的函数内部,最初数组没有元素。
4)接下来是我们的for循环。 for (var i=list;list; i = i.rest)
内部循环首先我们分配 var i=list;
意味着我们将对象列表的所有 属性 分配给 i
这意味着我们可以通过 i
,
示例:
i.value will result 10
5) 这里的下一个条件语句是 i
而在你的程序中是 node
在这种情况下都具有相同的含义:
当 i
为空时,条件将为假,在您的情况下 node
为空。
6)i=i.rest
它将给出对象的属性或对象的值。
示例:listobject.value will result 10
listobject.rest.value will result 20
listobject.rest.rest.value will result 30
7) 最后 array.push(i.value);
将值添加到我们的数组中,我们的数组中包含 10,20,30
我有你同样的问题:我不清楚,我希望作为一本学习 JavaScript 的书,它会得到更好的解释。然后我停下来思考,并考虑了以下问题。
作者的"fault",恕我直言,在于一个简单的事情:与其简单地将node
写成他本可以写成node != null
的第二个语句,那会更突出且易于教学("do the loop while node is not null":并且由于 node
仅在最后一次迭代中为空 - 然后返回 false
- 它会停在那里):试试你自己,这有效