2015-05-13 17 views
2

书中说:listToArray能言善辩的JavaScript

跑过来列表(在listToArray和第n个),一个像这样循环规范可用于:

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

循环的每次迭代,节点指向当前子列表,并且主体可以读取其value属性以获取当前元素。在迭代结束时,节点移动到下一个子列表。当它为空时,我们已经到达列表的末尾,循环结束。

问题1:你能解释一下for循环的条件是如何工作的吗?我知道它正在检查节点(当前列表)是否为空...但是“节点”参数本身是如何工作的?

问题2:为什么下面的代码不起作用?

function listToArray(list){ 
    var result = []; 
    while(list.value != null){ 
     result.push(list.value); 
     list = list.rest; 
    } 
    return result; 
}; 

console.log(listToArray(list)); 
+1

对于它的价值在现代的JavaScript你会榜上无名迭代,而不是滚动您自己的迭代方案。 –

回答

3

要理解它是如何工作的,你需要知道两件事情:

  • 如何Java脚本For循环的作品。
  • 什么是truthy值。

syntax的for循环语句:

为([初始化]; [条件]; [最终表达式])语句

[条件]的表达式进行之前评估每个循环迭代。 如果该表达式的值为true,则执行语句。如果 表达式评估为假,执行跳转到所述第一表达 以下的为构建体。

在Java脚本中,当在布尔上下文中计算值时,truthy值的计算结果为true。除非它们被定义为falsy

所有值均为truthy(即,除了 为假,0 “”,null,未定义和NaN)。

所以直到nodenull在一个点上,我们maynodetruthy和计算结果为true。

当语句node = node.restnull值分配给node时,那里出现for循环。

在下面的代码不工作,因为,list.value可以是undefined,或作为实际上比其它null任何其它falsy值。

function listToArray(list){ 
    var result = []; 
    while(list.value != null){ 
     result.push(list.value); 
     list = list.rest; 
    } 
    return result; 
}; 

console.log(listToArray(list)); 

改为尝试,while(list.value)

2

...但如何通过自身的 “节点” 的说法工作?

node变量。一个变量被解析为它的值。例如。如果我有

var foo = 3; 
alert(foo + 1); 

这将解决foo的价值3,然后添加1它。类似地,在这种情况下,node被解析为其具有的任何值,该值是转换为布尔值(即Boolean(node)),然后测试它是否是truefalse

如果node的值为null,则Boolean(node)将返回false

为什么下面的代码不起作用?

如果不知道list是什么以及究竟是什么“不起作用”,那么无法真正知道。

但是据推测,list.restnull在某些时候,在这种情况下,你会尝试访问null.value,它会引发错误。等效版本的for循环会比较list本身:

while (list != null) 
0

一个更简单的方法是使用: VAR结果= Array.prototype.slice.call(列表);

这将打开列表到一个数组

0
function listToArray(listValue){ 
    var arrayResult = []; 

    while(listValue.list){ 
     arrayResult.push(listValue.value); 
     listValue = listValue.list; 
     } 

    arrayResult.push(listValue.value); 

    return arrayResult; 
}