listToArray雄辩的JavaScript

时间:2015-05-13 20:22:43

标签: javascript arrays list

这本书说:

要在列表上运行(在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));

4 个答案:

答案 0 :(得分:3)

要了解其工作原理,您需要了解两件事:

  • java script For循环如何工作。
  • 什么是truthy值。

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 nodetruthy并且评估为真

当语句node = node.restnull分配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,在这种情况下,您会尝试访问引发错误的nullnull.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>