JS 两种for有什么区别?

如下代码,使用:


for(i = 0; i < mycars.length; i++) {
        console.log(IsNullOrWhiteSpace(mycars[i]))
   }

就会陷入死循环。


而使用:

for(var i in mycars) {
        console.log(IsNullOrWhiteSpace(mycars[i]))
    }

代码则正常运行,两种循环有什么区别?


完整代码如下:

function IsNullOrWhiteSpace(value) {
        if(value != null) {
            for(i = 0; i < value.length; i++) {
                if(!isWhitespace(value[i])) {
                    return false;
                }
            }
        }
        return true;
    }

    function isWhitespace(s) {
        var whitespace = " \t\n\r";
        var i;
        for(i = 0; i < s.length; i++) {
            var c = s.charAt(i);
            if(whitespace.indexOf(c) >= 0) {
                return true;
            }
        }
        return false;
    }
    var mycars = new Array();
    mycars[0] = "Saab";
    mycars[1] = " Volvo";
    mycars[2] = "BMW";
    mycars[3] = "BMW";
    mycars[4] = "BMW";
    mycars[5] = " ";
    mycars[6] = "";
    mycars[7] = null;
    //  for(i = 0; i < mycars.length; i++) {
    //      console.log(IsNullOrWhiteSpace(mycars[i]))
    //  }
    for(var i in mycars) {
        console.log(IsNullOrWhiteSpace(mycars[i]))
    }
阅读 4.9k
8 个回答

for(i = 0; i < mycars.length; i++) {

    console.log(IsNullOrWhiteSpace(mycars[i]))

}

你所有的循环体都没有使用var去定义i,导致i成了全局变量,重复赋值导致i取值不确定,因此可能导致死循环了。赋值过程请自行debug。

前者的循环条件是 只要满足 i < mycars.length这个条件就会进入里执行。而后者的意思是遍历mycars这个对象的属性

如果对对象格式的数据进行遍历,两者中 for in 才能起作用了。
比如:

var obj = {
    name: "张三",
    age : 18
}

第一个for循环,i 改成 j 吧...全局变量不能随便复用

for 循环常用来遍历数组,因为 for 循环可以循序的遍历数组

而 for in 循环则不然,故 for in 循环常用来遍历对象

外面的for循环没有任何问题,死循环肯定是IsNullOrWhiteSpace这个函数里的循环导致的,好好检查一下逻辑
至于楼上说的加不加var影响不大,因为在js中for和if语句都不会产生局部变量,加var不加var for中生成的i在外部也可以访问到。只有function会产生局部变量
不过IsNullOrWhiteSpace这个函数中的i必须要加var,不然会覆盖全局的变量i

谢邀。我曾罗列过for类语句使用的地方,希望有助 for

第一个for循环里,那个 i 没有声明,你写成 var i=0 ,试试。

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