这本书说:
要在列表上运行(在listToArray和nth中),可以使用这样的for循环规范:
for (var node = list; node; node = node.rest) {}
循环的每次迭代,节点都指向当前子列表,并且正文可以读取其value属性以获取当前元素。在迭代结束时,节点移动到下一个子列表。当它为null时,我们已到达列表的末尾并且循环结束。
问题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));
答案 0 :(得分:3)
要了解其工作原理,您需要了解两件事:
for循环语句的syntax
:
for([initialization]; [condition]; [final-expression])statement
[condition]在每次循环迭代之前要计算的表达式。 如果此表达式的计算结果为true,则执行语句。如果 expression的计算结果为false,执行将跳转到第一个表达式 遵循for构造。
在Java脚本中,在布尔上下文中计算时,truthy
值的计算结果为true。
除非将它们定义为假的,否则所有值都是真实的(即除了 for false,0,"",null,undefined和NaN)。
所以,直到node
null
为止,我们 may 说node
是truthy
并且评估为真
当语句node = node.rest
为null
分配node
值时,就会退出for循环。
以下代码不起作用,因为list.value
可能是undefined
,或者除falsy
以外的任何其他null
值。
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)
。
答案 1 :(得分:2)
...但是"节点"论证本身有效吗?
node
是变量。变量被解析为其值。例如。如果我有
var foo = 3;
alert(foo + 1);
它会将foo
解析为值3
,然后将1
添加到其中。类似地,在这种情况下,node
被解析为它具有的任何值,该值被转换为布尔值(即Boolean(node)
),然后测试它是否为{{1} }或true
。
如果false
的值为node
,则null
将返回Boolean(node)
。
为什么以下代码不起作用?
在不知道false
是什么以及究竟是什么"不起作用的情况下,真的无法告诉他们。"
但据推测,list
在某些时候是list.rest
,在这种情况下,您会尝试访问引发错误的null
。 null.value
循环的等效版本是比较for
本身:
list
答案 2 :(得分:0)
更简单的方法是使用: var result = Array.prototype.slice.call(list);
这会将列表转换为数组
答案 3 :(得分:0)
<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
</resources>