为什么在中间参数为'null'时for循环终止?

时间:2014-10-24 18:24:24

标签: javascript loops

我是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'是假的。重申这个问题,也许更简洁:为什么我们不需要比较运算符(' ===')来终止循环?

3 个答案:

答案 0 :(得分:3)

null在js中是假的,因此条件的计算结果为false,终止for循环。比较运算符返回布尔值。您不需要比较运算符,因为您已经有一个布尔(ish)术语。

答案 1 :(得分:2)

for循环的测试表达式可以是任何表达式。它被评估为布尔值,但不必进行比较。

比较语法没有什么特别之处。 x == y只是一个表达式,与1+2myfunc(blah)相同。在这种情况下,表达式的值不是数字,而是布尔值:true如果xy“相等”(在==规则下),否则false

(您可以在其他任何地方使用表达式进行比较;例如:

does_x_equal_y = (x == y)

会将变量does_x_equal_y设置为truefalse。)

当评估任意非比较表达式时,除了truefalse之外,它的值有很多种可能性。但是在布尔上下文中,例如for循环中的测试,所有这些可能性都被解释为等同于一个或另一个。我们将被解释为真“truthy”的非布尔值和被解释为false“falsy”的值称为非布尔值,以将它们与实际布尔值truefalse区分开来。

在Javascript中,nullundefined以及0和空字符串(以及其他一些东西)都是假的,但其他一切都是真实的。因此,如果node.next引用一个对象,它将是真实的,并且循环将继续;如果它是未定义/ null,它将是假的,循环将退出。

答案 2 :(得分:0)

进一步解释,在JavaScript中查找falsey值的一个好方法是打开Console并输入:

null ? true : false

在大多数情况下,这些值很直观。