此 for-in 循环检测代码段是否会生成不需要的误报?

Will this for-in loop detection snippet generate unwanted false positives?

提问人:Bergi 提问时间:7/16/2012 最后编辑:CommunityBergi 更新时间:8/3/2012 访问量:1237

问:

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

因此,我编写了这个简单的代码片段,它为 “” 属性添加了一个可枚举的 getter(不适用于生产代码):errorArray.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

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

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

JavaScript 循环

评论

0赞 hugomg 7/16/2012
我编辑了你的问题,使其不那么主观。我希望你不介意。
0赞 Bergi 7/16/2012
谢谢,我喜欢那个版本 - 我不知道该用什么作为标题:-)
0赞 Esailija 7/18/2012
我不明白,你如何将其扩展到?你需要使用什么的。它现在只会导致错误,因为扩展函数将获取它并抛出错误并停止复制。jsfiddle.net/MvgJCArray.prototype__lookupGetter__
0赞 Bergi 7/18/2012
如果您用作扩展函数而不是jQuery的函数(这就是我编写的原因)则不会...Object.getOwnPropertyNames(o).each(function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(o,n));})Object.extend

答:

-1赞 Steve Campbell 8/3/2012 #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...在“数组迭代中是个坏主意吗?以获取更多信息和意见。

评论

3赞 Bergi 6/4/2013
不,防御性编码循环(这很好)永远不会访问 where is ,因此它不会引发异常。a[prop]prop"error"