【问题标题】:How does javascript handle undefined comparators within for loops?javascript 如何处理 for 循环中未定义的比较器?
【发布时间】:2013-09-12 20:18:43
【问题描述】:

由于以下代码,我最近成为了我认为是 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 没有属性 bar,所以 foo['bar'] 是未定义的,并且比较器永远不会返回 true(并结束循环)。

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

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

【问题讨论】:

  • Afaik n &lt; undefined 总是返回 false,尽管值是 n。你测试过哪个浏览器?可能没有无限循环,只是一个错误停止执行......
  • 从该代码中我只得到一个异常“无法访问undefined (foo.bar) 上的length 属性”,这导致该行永远无法到达。没有无限循环。请提供一个实际表现出所概述行为的示例代码……
  • "TypeError: foo.bar is undefined" 是我得到的错误
  • 嗯。也许我的情况比我想象的要复杂。这是在通过 Mongoose.js 调用访问 Mongo 数据库结果的 Node.js 服务器上。我会看看我是否可以更好地了解代码,但我不确定我是否可以提供像 只是运行的 jsfiddle 之类的东西。
  • 根据要求更新代码。

标签: javascript mongodb undefined


【解决方案1】:

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

var a;

a.length; //TypeError: a is undefined

另外,我做了一些测试,并使用&lt; 运算符将 undefined 与数字进行比较总是返回 false。

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

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

var o = {};

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

也许你的假设是错误的?

【讨论】:

  • 这个。我将原始海报的代码复制/粘贴到 JS 控制台中,它确实引发了 TypeError。
  • 为了它的价值,我已经改变了提供的原始代码。我认为这是特定于 Mongo 处理事情的方式,可能不是底层 JS 的问题。
  • @RavenDreamer,您是否直接在 NodeJS 中尝试过我的示例,看看处理方式是否不同?另外,你能断言result['a'].length 返回undefined吗?
  • @plalx 我可以断言 result['a'] 返回未定义。执行 console.log(result['a'].length) 没有输出 anything。 (虽然也没有错误)。
  • @RavenDreamer:那么您的应用程序中必须有一些东西可以捕获异常(在循环比较中或从您的日志尝试中触发)而不输出任何内容,而是静默重启。你知道这样的代码吗?
猜你喜欢
  • 1970-01-01
  • 2011-09-28
  • 1970-01-01
  • 1970-01-01
  • 2016-06-19
  • 1970-01-01
  • 1970-01-01
  • 2021-06-13
相关资源
最近更新 更多