1

由于以下代码,我最近成为了我认为是 javascript 中的无限 for 循环的受害者。

//Mongoose Schema, defined elsewhere
var foo  = new Schema({
        _id: Number,
         a: [ Number ],
         b: [ Number ] });

...

//loop code, running on node.js server

Foo.findOne({}, 'b').exec().then(function(result)
{
 if(result)
 {
 for(var i = 0; i < result['a'].length; i++)
    {
     ...  
     //oops, we used the wrong property!
    }
 console.log("This line is never reached!");
 }
}

因为 foo 没有 property bar, foo['bar'] 是未定义的,并且比较器永远不会返回 true (并结束循环)。

但这段代码最让我吃惊的是它不会崩溃。所以我很好奇 - 比较一个数字是否undefined总是等于真的?因为程序无限循环,我知道比较不会返回 false。

为了测试,我将小于换成大于,但我仍然没有到达控制台输出。那么发生了什么?为什么这不会导致运行时错误,实际上是在比较什么?

4

1 回答 1

2

实际上,如果foo对象没有bar属性,它会抛出 a TypeError,因为您试图访问未定义变量的属性。这应该会停止脚本执行。

var a;

a.length; //TypeError: a is undefined

此外,我进行了一些测试并使用<运算符将​​ undefined 与数字进行比较总是返回 false。

0 < undefined; //false
1 < undefined; //false

按照这个逻辑,以下内容不应该循环,这就是我的情况:

var o = {};

for (var i = 0; i < o.length; i++) {
    console.log(i);
}

也许你的假设是错误的?

于 2013-09-12T20:29:41.003 回答