从来没有见过循环这种方式如何工作?

时间:2016-01-20 00:51:41

标签: javascript for-loop

我只是在阅读一本书,但它没有提到以这种方式使用Daterange。我能理解的最常见的方式,但我不知道它是如何开始和结束的。

这是一个函数,其中包含一个for循环,插入到参数中的是一个继承对象和对象的对象,如列表。

for

function listToArray(list) { var array = []; for (var node = list; node; node = node.rest) array.push(node.value); return array; } var object = { value: 10, rest: { value: 20, rest: { value: 30, rest: null } } } console.log(listToArray(object)); // → [10, 20, 30] 这是我不了解它如何运作的部分。它是如何开始或结束的。

我只是一个简单的猜测自己开始,节点是一个对象,所以如果for (var node = list; node; node = node.rest)然后node != nullnode = list是下一个对象

4 个答案:

答案 0 :(得分:5)

for循环有三个参数:

for ([initialization]; [condition]; [final-expression])

var node = list;在循环启动时运行。

node是条件,如果是假,则循环不会再次出现。

node = node.rest在循环结束时运行。

所以:

它将node设置为list,然后将node替换为先前节点rest属性的值。

最终node{ value: 30, rest: null },因此它将node设置为null,然后测试null是否为true,然后停止,因为它不是{ #39;吨

答案 1 :(得分:1)

与任何其他基于c的语言一样,for循环基本上是这样形成的:for(initialization;condition;incrementation)

在此代码中,初始化部分定义了一个名为node的新var,并将其值初始化为与参数list相同。

javascript中的条件部分node表示节点!= null(或未分配)

增量部分将节点设置为node.rest的值。 我不知道node.rest做了什么,但我想它会移动到树/图中的下一个节点。

因此,在这种情况下,for会在分配列表时启动,并在node.rest返回null / unassigned时结束。

答案 2 :(得分:1)

这实际上非常有趣!但是你在这里得到的是一个for循环,它以一种非常有创意的方式用于深入迭代到一个对象。

for (var node = list; node; node = node.rest)

如果我们考虑传统意义上的循环,比如

for (var i = 0; i < 10; i++)

我们可以画几个相似之处。

如果您查看for {循环的MDN,您会发现它分为三个部分:

for ([initialization]; [condition]; [final-expression])

初始化 - 指定将在循环开始时使用的变量等,在这种情况下,我们的起始节点等于传入的list

条件 - 现在这里有点不同,但基本上这个中间语句是确定循环是否应该执行的条件。大多数情况下,您会看到i < 10或某些数字比较,因为这是一个常见的用例。这个例子是利用javascript中对象的真实性。也就是说,一个对象本身评估为true

离。 if({}) // will be true node放在那里的事实基本上就是说&#34;看看node的真实性,如果对象存在,那么让我们运行循环!否则node将为undefined,而undefined在javascript中为false值。

最后,我们有最后的表达方式,或者我喜欢称之为“更新”的内容。部分。我们基本上将node指定为与其子属性相等,这意味着我们将迭代地越来越深入地研究这些对象。如果存在node.rest,那么循环的下一次迭代将从那里开始并在前一循环中实际存在node.rest时再次运行。

好问题。我喜欢那个。

答案 3 :(得分:0)

试试这个:

Boolean(object.rest); //true
Boolean(object.rest.rest); //true
Boolean(object.rest.rest.rest); //false