2017-02-27 77 views
3

我正在阅读Eloquent Javascript by Marijn Haverbeke,我正在研究第4章的obj数组和obj练习数组。到数组obj中的解决方案如下:循环obj练习

var list = {value: 1, rest: { value: 2, rest: { value: 3, rest: null}}}; 
 

 
function listToArray(list){ 
 
\t var array = []; 
 
\t for(var node = list; node; node = node.rest){ 
 
\t \t array.push(node.value); 
 
\t } 
 
\t return array; 
 
} 
 

 
console.log(listToArray(list));

我对什么是对发生的for循环困惑。这就是我明白:

  1. 变量节点等于列表对象
  2. 的长度等于这是一样的列表对象
  3. 和节点的节点等于价值休息

有人能够简单地分解这个for循环中发生的事情吗?

+0

这不是一个骗局!哎呀。 –

+0

https://developer.mozilla.org/ar/docs/Web/JavaScript/Reference/Statements/for –

+0

@Kinduser,其根本问题在于['for'](https://developer.mozilla.org/ en-US/docs/Web/JavaScript/Reference/Statements/for)循环工作。 – zzzzBov

回答

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

第一部分(至第一个;)表示;通过将节点设置为列表来初始化节点;

第二部分的意思是;保持循环,直到'节点'为空。这是因为第二部分实际上是一个表达式,你经常看到像i<list.length这样的东西,但它不必涉及长度,它只需要是布尔型的,真实意味着继续前进,假意味着停止。在Javascript中,你可以将表达式的对象变量,它意味着相同的node!=null

第三部分手段;在每个循环设置节点之后等于node.rest的结果。其中node.rest是另一个需要解决的问题。

所以它循环的第一次,这是你所得到的

node = {value: 1, rest: { value: 2, rest: { value: 3, rest: null}}} 

,这将推动node.value(这是1)上array

第二次它循环你得到;

node = { value: 2, rest: { value: 3, rest: null}} 

,它会推node.value(其2)上array

依此类推,直到node.rest为空。

+0

谢谢@jimW这很有道理! –