这种for循环是什么意思?没有见过这种循环?求指点

      //如果是HTML字符串就将其转换成HTML元素  '<div><p>123</p></div>'
        if ($.isHTML(selector)) {
            var div = document.createElement('div'), node, result = [];
            div.innerHTML = selector;
            //获取div所有子元素
            ***for (node = div.firstChild; node; node.nextSibling) {***
                if (node.nodeType === 1) {
                    ret.push(node);
                }
            }
        }
        
        

一般循环不都是var i=0,i<xxx.length;i++吗 这种的循环是啥意思?selector就是$('selector')里面的元素 , 这种循环初始值是什么?循环的条件是什么?到哪里结束,怎么样去++的?

阅读 5.5k
7 个回答

MDN有详细解释

第一个语句
一个表达式 (包含赋值语句) 或者变量声明。典型地被用于初始化一个计数器。
第二个语句
一个条件表达式被用于确定每一次循环是否能被执行。如果该表达式的结果为true, statement 将被执行。
第三个语句
每次循环的最后都要执行的表达式。

从来就没有语句一必须声明计数器。语句二的判断一定要是比较长度。语句三一定要递增或者递减。

第一条是div的孩子,中间那个条件就是node的兄弟是否存在,最后一条表示node的兄弟
意思就是说一直循环node的兄弟,知道node没有兄弟了
希望采纳

for 语句用于创建一个循环,它包含了三个可选的表达式,三个可选的表达式包围在圆括号中并由分号分隔, 后跟一个在循环中执行的语句(通常是一个块语句)。

语法

for ([initialization]; [condition]; [final-expression])
statement

initialization
一个表达式 (包含赋值语句) 或者变量声明。典型地被用于初始化一个计数器。该表达式可以使用var关键字声明新的变量。初始化中的变量不是该循环的局部变量,而是与for循环处在同样的作用域中。该表达式的结果无意义。
condition
一个条件表达式被用于确定每一次循环是否能被执行。如果该表达式的结果为true, statement 将被执行。 这个表达式是可选的。如果被忽略,那么就被认为永远为真。如果计算结果为假,那么执行流程将被跳到for语句结构后面的第一条语句。
final-expression
每次循环的最后都要执行的表达式。执行时机是在下一次condition的计算之前。通常被用于更新或者递增计数器变量。
statement
只要condition的结果为true就会被执行的语句。 要在循环体内执行多条语句,使用一个块语句({ ... })来包含要执行的语句。没有任何语句要执行,使用一个空语句(;)。

更多

题主代码应该不完整吧,不过我相信看完这个你就明白了,欢迎追问

node = div.firstChild; node; node.nextSibling

1 node = div.firstChild # 初始化Node绑定为div的第一个子元素
2 node; #每当node这个变量存在,就代表循环仍然继续
3 node.nextSibling # 每当完成一个循环,就将Node绑定为下一个兄弟元素

也就是说 这个循环的含义就是从div的第一个子元素一直循环到最后一个子元素 并且Node就等于循环到的那个子元素

先看一段MDN上的说明:node.nextSibling 是一个只读属性,返回其父节点的 childNodes 列表中紧跟在其后面的节点,如果指定的节点为最后一个节点,则返回 null。
再说一下,您的for (node = div.firstChild; node; node.nextSibling)这第三个表达式写的有问题,这里只是获取node的下一个兄弟节点,并未对node赋值,应该改成for (node = div.firstChild; node; node = node.nextSibling)这个样子,就好理解了。
先是将node初始化为div的第一个子节点,判断node是否为null或underfined,不为空则执行for内部的循环体,然后让node变成它自己的下一个兄弟节点,再判断node是否为null,不为null则再执行循环体,依此反复…… 当node为div子节点中的最后一个节点时,下一次就返回null,这样就跳出循环了。
var node;
// 判断node值是不是为""、null、undefined
// 很多人是真么判断的
if (node == "" || node == null || node = "undefined") {
    //...
}

// 其实判断node是不是有值,或非undefined,没有必要这么麻烦
// 看下面的例子

if (node) {
    // 就是这么简单
}



如果LZ能够明白这个,上面的for应该没有什么疑问了!

就相当于

for(var i=0,len=node.parentNode.childNodes.length;i<len;i++){
    if(node.parentNode.childNodes[i].nodeType===1){
        ret.push(node);
    }
}

为什么可以那样写请参考楼上的。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏