在 Firefox 60.2 中运行此 JavaScript 仅列出一个属性(“位置”),但还有许多其他属性,例如“document.title”等。
window.console.log("List props: " + Object.keys(window.document).sort().join(' / '));
为什么会这样?安全?这在技术上是如何完成的?如何列出所有属性?
在 Firefox 60.2 中运行此 JavaScript 仅列出一个属性(“位置”),但还有许多其他属性,例如“document.title”等。
window.console.log("List props: " + Object.keys(window.document).sort().join(' / '));
为什么会这样?安全?这在技术上是如何完成的?如何列出所有属性?
Object.keys(o)
返回 的自己的、可枚举的属性o
。
o
,而不是在其原型链上:在这种情况下,您期望的大多数键都定义在 indocument
的原型链中的另一个对象上:
document.hasOwnProperty("title"); // false
document.__proto__.__proto__.hasOwnProperty("title"); // true
document.__proto__.__proto__.propertyIsEnumerable("title"); // true
您可以使用循环来查找在对象或其原型链for... in
上定义的可枚举属性:
for (let key in window.document) {
console.log(key);
}
原因是Object.keys()
return 返回一个字符串数组,表示给定对象的所有可枚举属性。试试这个看看文档的哪些属性是可枚举的
for(let key in document){
let isEnumerable = document.propertyIsEnumerable(key);
console.log(`docment['${key}'] isEnumerable?:${isEnumerable}`);
}
但是,正如前面的答案所述,您可以使用 for-in 循环来获取数组中的所有属性对它们进行排序并加入它们
我找不到它不能与 window.document 一起使用的官方原因,但似乎您也可以使用其他变量重现此行为。问题似乎 Object.keys()
不是从这些变量中返回所有内容。
如果您仍在尝试获取文档的所有属性,您仍然可以使用
var props = [];
for(var prop in window.document) {
props.push(prop);
}
console.log("List props: " + props.sort().join('/'));
这将与您的方法完全相同。