Будет ли этот фрагмент обнаружения внутри цикла генерировать нежелательные ложные срабатывания?

Мы все знаем, что 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.

Теперь мой вопрос: Есть ли ситуации, которые легитируют такие "неправильные" циклы, или что-нибудь еще, вызывающее ложноположительные предупреждения?

Мне интересно, как это повлияет на полезность моего кода.

Ответ 1

Да. Легитимность часто может быть субъективной, но...

В качестве примера, возможно, у меня есть разреженный массив, где я только установил значения в индексах с данными:

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

Если бы я хотел итерации по элементам, которые я определил в этом массиве, я бы использовал конструкцию for...in. Даже если бы я закодировал его защитно, ваш script все равно будет срабатывать (ложно положительный)...

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

См. также Почему используется "для... в" с итерацией массива плохая идея? для получения дополнительной информации и мнений.