Ответ 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
, соответственно, в моем тестировании.