提问人:Bergi 提问时间:7/16/2012 最后编辑:CommunityBergi 更新时间:8/3/2012 访问量:1237
此 for-in 循环检测代码段是否会生成不需要的误报?
Will this for-in loop detection snippet generate unwanted false positives?
问:
我们都知道数组上的 for-in-loop 是绝对邪恶的。尽管如此,它们仍然经常被使用,并且导致的错误很难追踪,尤其是在发生依赖于浏览器时,例如由于 -shims 等。indexOf
因此,我编写了这个简单的代码片段,它为 “” 属性添加了一个可枚举的 getter(不适用于生产代码):error
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
我现在的问题是:是否有任何情况可以使这种“错误”循环合法化,或者是否有其他任何导致误报警报的情况?
我想知道这将如何影响我的代码的有用性。
答:
-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"
评论
Array.prototype
__lookupGetter__
Object.getOwnPropertyNames(o).each(function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(o,n));})
Object.extend