我只是在阅读一本书,但它没有提到以这种方式使用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 != null
和node = list
是下一个对象
答案 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