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; } };