我是javascript的初学者。
我对其中一个提示'提出了一个问题。在" A List"来自eloquent javascript的运动问题:
让我们说我在名为listToArray的函数体中循环遍历以下列表:
var list = {
value: 1,
rest: {
value: 2,
rest: {
value: 3,
rest: null
}
}
};
提示建议使用以下循环:for (var node = list; node; node = node.rest) {}
解释如下:
你能看出它的运作方式吗?循环的每次迭代,节点都指向当前子列表,并且正文可以读取其value属性以获取当前元素。在迭代结束时,节点移动到下一个子列表。当它为null时,我们已到达列表的末尾并且循环结束。
我想知道的是:为什么我们不需要写node === null
作为中间参数,就像我生命中见过的所有其他循环一样?
更新:我理解' null'是假的。重申这个问题,也许更简洁:为什么我们不需要比较运算符(' ===')来终止循环?
答案 0 :(得分:3)
null
在js中是假的,因此条件的计算结果为false,终止for循环。比较运算符返回布尔值。您不需要比较运算符,因为您已经有一个布尔(ish)术语。
答案 1 :(得分:2)
for
循环的测试表达式可以是任何表达式。它被评估为布尔值,但不必进行比较。
比较语法没有什么特别之处。 x == y
只是一个表达式,与1+2
或myfunc(blah)
相同。在这种情况下,表达式的值不是数字,而是布尔值:true
如果x
与y
“相等”(在==
规则下),否则false
。
(您可以在其他任何地方使用表达式进行比较;例如:
does_x_equal_y = (x == y)
会将变量does_x_equal_y
设置为true
或false
。)
当评估任意非比较表达式时,除了true
和false
之外,它的值有很多种可能性。但是在布尔上下文中,例如for
循环中的测试,所有这些可能性都被解释为等同于一个或另一个。我们将被解释为真“truthy”的非布尔值和被解释为false“falsy”的值称为非布尔值,以将它们与实际布尔值true
和false
区分开来。
在Javascript中,null
和undefined
以及0和空字符串(以及其他一些东西)都是假的,但其他一切都是真实的。因此,如果node.next
引用一个对象,它将是真实的,并且循环将继续;如果它是未定义/ null,它将是假的,循环将退出。
答案 2 :(得分:0)
进一步解释,在JavaScript中查找falsey值的一个好方法是打开Console并输入:
null ? true : false
在大多数情况下,这些值很直观。