Est-ce que Object.keys () fonctionne dans Internet Explorer 9 pour des objets intégrés?

La méthode Object.keys () fonctionne bien pour moi avec un code comme celui-ci:

var foo = {foo: 1, bar: 2}; console.log(Object.keys(foo).length); 

Cependant, Object.keys () renvoie un tableau de longueur zéro pour les objets intégrés avec un code comme ceci:

 <!doctype html> <html> <head> <title>Object.keys()</title> </head> <body> <script type="text/javascript"> console.log(Object.keys(window.document).length); </script> </body> </html> 

Est-ce que je manque quelque chose? J'utilise Internet Explorer 9.0.8112.16421.


Postscript: Je ne sais toujours pas pourquoi cette (par exemple):

  for (prop in performance.timing) { if (performance.timing.hasOwnProperty(prop)) { console.log(prop); } } 

… ne produit rien dans IE9, alors que cela fonctionne bien:

 for (prop in performance.timing) { console.log(prop); } 

En JavaScript, il existe des objets natifs et des objets hôtes . En général, vous pouvez compter sur des objets comme Object.keys travaillant avec des objets natifs, mais pas avec des objets hôtes. window , le document et d'autres sont des objets hôtes. IE en particulier est bien connu pour ses objets hôtes n'étant pas indigènes (les fonctions de l'hôte n'ont pas la fonction d' call ou d' apply , etc.).

Alternativement, bien sûr, il se pourrait que ce document ne comporte aucune propriété énumérable . La plupart des propriétés par défaut des objets ne sont pas énumérés et ne s'affichent donc pas dans Object.keys . Par exemple, Object.keys([]).length et Object.keys(new RegExp(".*")).length est à la fois 0 car aucune des propriétés énumérables , même si elles ont tous deux beaucoup de propriétés (elles ont des propriétés pour Toutes leurs "méthodes", et bien sûr, le tableau blanc a une propriété de length et le RegExp a une propriété lastIndex ).


Mise à jour : en fait, c'était la chose énumérable. Essayez ce test:

 alert(Object.keys(window.document).length); window.document.AAA__expando__property = "foo"; alert(Object.keys(window.document).length); 

Pour moi, sur IE9, ces alertes sont "0" et "1", respectivement. Donc window.document prend en charge Object.keys , c'est juste que window.document n'a pas, par défaut, des propriétés énumérables . (En revanche, sur Chrome, j'ai 65 propriétés énumérables pour commencer et, bien sûr, 66 fois j'ai ajouté mon expando.)

Voici une page de test plus complète ( copie en direct ) (piraté rapidement, pas une chose de beauté):

 window.onload = function() { document.getElementById('theButton').onclick = function() { if (typeof Object.keys !== 'function') { display("<code>Object.keys</code> is not a function"); return; } showKeys("Before adding", Object.keys(window.document)); window.document.AAAA__expando__foo = "bar"; showKeys("After adding", Object.keys(window.document)); }; function showKeys(prefix, keys) { var p, ul; keys.sort(); prefix = "[" + prefix + "] Keys on <code>window.document</code> (" + keys.length + ")"; if (keys.length !== 0) { prefix += " (click to toggle list)"; } p = display(prefix); if (keys.length !== 0) { ul = document.createElement("ul"); ul.innerHTML = "<li>" + keys.join("</li><li>") + "</li>"; ul.style.display = "none"; document.body.appendChild(ul); p.onclick = function() { ul.style.display = (ul.style.display === "none") ? "" : "none"; }; } } function display(msg) { var p = document.createElement('p'); p.innerHTML = msg; document.body.appendChild(p); return p; } };