对于有奇怪条件的循环

时间:2017-09-04 21:11:32

标签: javascript

我看到了这个片段,正在阅读MDN的教程"A re-introduction to JavaScript (JS tutorial)"

function countChars(elm) {
  if (elm.nodeType == 3) { // TEXT_NODE
    return elm.nodeValue.length;
  }
  var count = 0;
  for (var i = 0, child; child = elm.childNodes[i]; i++) {
    count += countChars(child);
  }
  return count;
}

我不理解的是for循环语句。具体而言,条件语句child = elm.childNodes[i]。我总是知道循环中的条件应该是合乎逻辑的。对我来说,这是一项任务。

我失去了什么?

4 个答案:

答案 0 :(得分:5)

i中的child = elm.childNodes[i]大于数组的长度时,deklaration会被评估为undefined。并且在js中undefined等于false Boolean(undefined) -> false

因此,这是一个布尔方程式。

这种等式是危险的,因为如果数组包含一个等于false(null, 0, false)的元素,则循环将停止而不迭代所有元素。

答案 1 :(得分:2)

此处for循环的条件是赋予操作符= 的值(换言之,值elm.childNodes[i])。



var a,
    assignmentOperatorValue = ( a = 5 );
//                            ^^^^^^^^^ this yields 5 which is then assigned to assignmentOperatorValue, you can even pass that value to a function like: func(a = 5);
    
console.log(assignmentOperatorValue);




如果elm.childNodes[i]是一个元素(真值),则条件为true

如果elm.childNodes[i]undefined(假值),则条件为false

答案 2 :(得分:1)

你是正确的认识到这是一个任务,我个人会避免编写这样的循环,因为它可能会让其他开发人员感到困惑。但是,它实际上是有效的,因为每个赋值表达式都返回已分配的值。例如,在以下语句之后,ab的值都为1

var a, b;
a = b = 1;

如果elm.childNodes是一个数组,那么child = elm.childNodes[i]将分配child的值并返回elm.childNodes[i]的值。如果elm.childNodes[i]是真实的,那么循环将继续。否则会破裂。

因此当循环达到高于数组中最后一个值的索引时,或者索引处的值为0falsenull或任何其他值时,此循环可能会中断JavaScript语言中的虚假值。程序员可能只是假设数组中的所有值都必须是不会计算为false的有效对象。

答案 3 :(得分:1)

for循环由3部分构成:

  • 初始化
  • 条件
  • 最终表达

在您的情况下,condition部分为child = elm.childNodes[i];

当访问属于我们范围的列表元素时,您将得到的值是undefined,条件将导致打破循环。