Подтвердить что ты не робот

Неперечислимые свойства появляются в... в цикле в Chrome

Цикл

A for - in будет проходить через все перечислимые свойства объекта, даже в цепочке прототипов. Функция hasOwnProperty может отфильтровывать те перечислимые свойства, которые находятся в цепочке прототипов. Наконец, функция propertyIsEnumerable может различать перечислимые свойства объекта.

Следовательно, следующее script не должно печатать ничего:

for(a in window)
    if(window.hasOwnProperty(a) && !window.propertyIsEnumerable(a))
        console.log(a);

В Chrome, однако, вышесказанное печатает много имен свойств.

Почему циклы for - in и propertyIsEnumerable противоречат друг другу в отношении перечислений?

4b9b3361

Ответ 1

Печальный факт заключается в том, что JavaScript-движки не совпадают. В то время как двигатели, соответствующие стандарту ES5, будут уважительно относиться к перечислимости своих свойств, window - это объект-хост, как указано выше, и не относится к правилам ES5.

Вы можете увидеть больше доказательств того, что объект window действительно находится в window.constructor, который покажет его как построенный из

function Window() { [native code] }

Таким образом, у нас нет реального способа определить, почему определенные свойства перечислены (в соответствии с Chrome), а другие - не из среды выполнения JavaScript.

Тем не менее, вы все еще можете увидеть полное состояние непоследовательных свойств window Chrome, просмотрев Object.keys(window), который согласно своей статье MDN, "возвращает массив всех собственных перечислимых свойств, найденных на данном объекте."

При этом сохраняется массив из 30 нечетных свойств. Отбросьте это до странности Chrome!

EDIT: после некоторого дополнительного тестирования я нашел подходящий способ для Chrome иметь смысл в отношении window перечислимых свойств

Object.keys(window).filter(function(prop) {
  return window.hasOwnProperty(prop) && !window.propertyIsEnumerable(prop);
});

Казалось бы, что в Chrome список свойств перечисления кандидатов для for...in не является тем, что возвращается Object.keys, но на самом деле намного ближе к Object.getOwnPropertyNames, в котором перечислены перечисляемые и неперечислимые свойства. Однако даже это противоречиво. Список свойств, которые window.hasOwnProperty(prop) && !window.propertyIsEnumerable(prop), выходят в 423 и 454 для for...in и Object.getOwnPropertyNames, соответственно, в моем тестировании.

Ответ 2

Chrome выглядит странно:

for(a in window)
    if(window.hasOwnProperty(a) && window.propertyIsEnumerable(a))
        console.log(a);

Он выдает около 30 свойств по сравнению с аналогичным способом 450, в хроме.