这个 for 循环条件是如何工作的?

Lin*_*ina 3 javascript loops for-loop eloquent

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

为什么下面代码中的 for 循环以 for 循环中的中间条件为“节点”而停止?

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));
Run Code Online (Sandbox Code Playgroud)

Aru*_*K V 5

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

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);
Run Code Online (Sandbox Code Playgroud)

这里 listobject 是一个对象字面量,我们使用 for 循环遍历对象字面量的值或对象字面量的属性。

我们可以把每一行代码

1) listToArray(listobject);

这是函数调用,这里我们将对象作为参数传递给函数。

2)当这段代码执行时,控制转到函数定义

 function listToArray(list) { ...}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

这意味着我们可以通过访问对象的每个属性i

例子:

i.value 将导致 10

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

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

条件i为空时为假 ,在您的情况下node为空。

6)i=i.rest

它将给出对象的属性或对象的值。

例子 : listobject.value will result 10

listobject.rest.value will result 20

listobject.rest.rest.value will result 30
Run Code Online (Sandbox Code Playgroud)

7)最后 array.push(i.value);

将值添加到我们的数组中,其中我们的数组包含 10,20,30