最近看到这样一段代码:
let fragment = document.createDocumentFragment();
let firstChild;
while(firstChild = el.firstChild) {
fragment.appendChild(firstChild);
}
return fragment;
代码中如果把fragment.appendChild(firstChild)注释掉,则会进入死循环,如果在while语句中去打印el.firstChild,则发现每次循环都在递进DOM节点,直到最后为空。请问这是什么原理呢?有没有这方面的资料文章呢?
while(firstChild = el.firstChild)
这个语句进行了2个操作:
firstChild = el.firstChild
while(firstChild)
,while
是条件为真的情况下才执行,也就是必须el.firstChild
有值的情况下才执行当判定
while(firstChild)
为真的情况执行fragment.appendChild(firstChild);
把
el.firstChild
即el.children[0]
抽出插入到fragment
。注意这个操作是move dom
,el.children[0]
被抽出,在下次while
循环执行firstChild = el.firstChild
时读取的是相对本次循环的el.children[1]
以此达到循环转移dom
的目的