Мы все знаем, что for-in-loops на массивах абсолютно злой. Тем не менее, они часто используются, и вызванные ошибки сложны для отслеживания, особенно когда происходит зависание браузера, например, из-за indexOf
-shims или такого.
Итак, я закодировал этот простой фрагмент, который добавляет перечислимый 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 'error' property :-)");
}
});
Вы можете добавить его как greasemonkey script для всех доменов, и вы увидите предупреждения почти на каждом сайте:-) Большинство из них вызваны вызовами jQuery.extend
с сомнительными аргументами, btw.
Теперь мой вопрос: Есть ли ситуации, которые легитируют такие "неправильные" циклы, или что-нибудь еще, вызывающее ложноположительные предупреждения?
Мне интересно, как это повлияет на полезность моего кода.