这对于循环条件如何工作?

时间:2015-02-23 11:24:11

标签: javascript loops for-loop eloquent

下面的代码示例来自Eloquent Javascript第4章练习4.3(列表)。

为什么下面代码中的for循环停止在中间条件中 for-loop is" 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));

3 个答案:

答案 0 :(得分:4)

首先,我们可以用不同的方式编写程序,这将更容易理解

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) { ...}

这里列表与我们在函数调用时传递的参数相同。

3)array = []; 在我们声明一个数组的函数内部,最初该数组没有元素。

4)接下来是我们的for循环。 for (var i=list;list; i = i.rest)

内循环首先我们分配var i = list;

表示我们将对象列表的所有属性分配给i

这意味着我们可以通过i

访问对象的每个属性

示例:

  

i.value将导致10

5)这里的下一个条件语句是i,在你的程序中它是节点

在这种情况下都具有相同的含义:

i为空时,条件将为false,在您的情况下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

答案 1 :(得分:0)

答案 2 :(得分:0)

我有同样的问题:我不清楚,我希望对于一本学习JavaScript的书,它会得到更好的解释。然后我停下来思考,然后考虑下来。

作者"故障",恕我直言,在于一件简单的事情:而不是简单地写node作为他可以写成node != null的第二个陈述,会更加突出和教学友好("在节点不为空时执行循环":并且因为node仅在最后一次迭代中为空 - 然后返回false - 它将停在那里):试试自己,这是有效的