强制进行不正确的比较以在JavaScript中引发警告/错误

时间:2014-03-31 20:12:10

标签: javascript runtime-error

我有类似以下的JavaScript代码:

var data = {"d": 12345};
for(var i = 0; i < data.length; ++i) {
    console.log(i);
}

我知道这个for循环不会执行任何循环,因为data.length将是未定义的&#39;和

0 < 'undefined' //false (I think this is false for any int?)

无论如何,当我修复我的代码时(在我的代码中,数据包含一个数组,但我不小心引用了data.length而不是data.myarr.length)我希望将来避免这样的问题 - 我有一段时间找到这个bug。

我一直在阅读strict mode in JavaScript,但在messing around with JSFiddle之后,我无法通过严格模式将上述内容视为错误。我试着让整个脚本变得严格,然后,想到可能存在冲突,在自己的方法中尝试并且仍然没有任何结果。

有没有办法强迫&#34;荒谬的&#34;比较如int&lt; &#34;未定义&#34;抛出错误(甚至是警告)?我是否错过了严格的模式?或者语言设计应该允许这样的事情?

3 个答案:

答案 0 :(得分:2)

Javascript本身没有任何内容可以选择这个。

我没有跟踪JS Lint的最新进展,但我不知道有什么可以帮助。

另一方面,TypeScript可以很好地处理这种情况。

就像头脑一样 - 这不是可以在Javascript中改变而不破坏现有代码的东西。有足够的array like个对象具有length属性和一个迭代的数字命名属性名称。

  • arguments关键字
  • 节点列表

答案 1 :(得分:2)

AFAIK,没有真正的方法来实现你所追求的目标。因为int < undefined是一个非常精细的比较。

对于此特定问题,您可以做的一件事是使用Array.forEach(MDN)。这会引发错误,因为data.forEachundefined并尝试将其称为函数将失败(除非您在具有函数值的数据上添加“forEach”键,当然):

var data = {"d": 12345};
data.forEach(function(item, index, array){
    console.log(index);
});

注意,IE&lt; 9没有Array.forEach,因此您需要将其添加到Array的原型中。点击此处了解详情,包括如何操作,Array.prototype.forEach() on MDN

答案 2 :(得分:1)

在ES6中,您可以通过for...of使用迭代器,这会导致错误,因为非数组对象不可迭代:

for (var x of data) { }

如果您还想索引,您还可以做出其他安排。