我看到了这个片段,正在阅读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]
。我总是知道循环中的条件应该是合乎逻辑的。对我来说,这是一项任务。
我失去了什么?
答案 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)
你是正确的认识到这是一个任务,我个人会避免编写这样的循环,因为它可能会让其他开发人员感到困惑。但是,它实际上是有效的,因为每个赋值表达式都返回已分配的值。例如,在以下语句之后,a
和b
的值都为1
:
var a, b;
a = b = 1;
如果elm.childNodes
是一个数组,那么child = elm.childNodes[i]
将分配child
的值并返回elm.childNodes[i]
的值。如果elm.childNodes[i]
是真实的,那么循环将继续。否则会破裂。
因此当循环达到高于数组中最后一个值的索引时,或者索引处的值为0
,false
,null
或任何其他值时,此循环可能会中断JavaScript语言中的虚假值。程序员可能只是假设数组中的所有值都必须是不会计算为false
的有效对象。
答案 3 :(得分:1)
for
循环由3部分构成:
在您的情况下,condition
部分为child = elm.childNodes[i];
。
当访问属于我们范围的列表元素时,您将得到的值是undefined
,条件将导致打破循环。