7

我们都知道数组上的for-in-loop绝对是邪恶的。尽管如此,它们仍然经常被使用,并且导致的错误很难追踪,尤其是当发生依赖于浏览器的情况时,例如由于indexOf-shims 等。

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

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带有可疑参数的调用引起的,顺便说一句。

我现在的问题是:是否有任何情况可以使这种“错误”循环合法化,或者其他任何导致误报警报的情况?

我想知道这将如何影响我的代码的有用性。

4

1 回答 1

-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
  }
}

另请参阅为什么在数组迭代中使用“for...in”不是一个好主意?了解更多信息和意见。

于 2012-08-02T17:57:05.173 回答