这个for-in循环检测片段是否会产生不必要的误报?

时间:2012-07-16 15:29:46

标签: javascript loops

我们都知道数组上的for-in-loopsabsolutely evil。尽管如此,它们经常被使用,并且导致的错误很难追查,特别是当发生依赖浏览器时,例如因为indexOf - 垫片等。

所以,我编写了这个简单的代码段,为error上的“Array.prototype”属性添加了可枚举的getter(不用于生产代码):

Object.defineProperty(Array.prototype, "error", {
    enumerable: true,
    get: function() {
        if (this === Array.prototype) // that looks OK
            return undefined;
        if (window.confirm("Somebody who coded the site you're viewing runs through an Array with a for-in-loop.\nShame on him!\n\nDo you want to raise an Error to trace the origin?"))
            throw new SyntaxError("Array traverse with for-in-loop, touching Array.prototype's 'error' property :-)");
    }
});

您可以将其添加为所有域的greasemonkey脚本,并且您将在几乎每个站点上看到警报:-)其中大多数是由jQuery.extend调用可疑参数引起的,顺便说一下。

我现在的问题是:是否有任何情况合法出现“错误”循环,或其他导致误报警示的情况?

我想知道这会如何影响我的代码的实用性。

1 个答案:

答案 0 :(得分:-1)

是。合法性通常可以是主观的,但是......

作为一个例子,也许我有一个稀疏数组,我只在数据索引处设置值:

var a = [];
a[123123] = "foo";
a[1233123] = "bar";

如果我想迭代我在这个数组中定义的元素,那么我会使用for...in构造。即使我在防御上编码,你的剧本仍会触发(误报)...

for (var prop in a) {
  if (a.hasOwnProperty(prop)) {
    // this is a legitimate array element
  }
}

有关更多信息和意见,另请参阅Why is using "for...in" with array iteration a bad idea?