3

在 Firefox 60.2 中运行此 JavaScript 仅列出一个属性(“位置”),但还有许多其他属性,例如“document.title”等。

window.console.log("List props: " + Object.keys(window.document).sort().join(' / '));

为什么会这样?安全?这在技术上是如何完成的?如何列出所有属性?

4

3 回答 3

2

Object.keys(o)返回 的自己的、可枚举的属性o

  • 自己的:直接定义在其原型链上的属性o,而不是在其原型链上:
  • Enumerable:一个标志,用于控制在列出对象的属性时是否包含给定的属性。

在这种情况下,您期望的大多数键都定义在 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);
}
于 2018-06-20T11:55:00.250 回答
0

原因是Object.keys()return 返回一个字符串数组,表示给定对象的所有可枚举属性。试试这个看看文档的哪些属性是可枚举的

for(let key in document){
  let isEnumerable  = document.propertyIsEnumerable(key);
  console.log(`docment['${key}'] isEnumerable?:${isEnumerable}`);
}

但是,正如前面的答案所述,您可以使用 for-in 循环来获取数组中的所有属性对它们进行排序并加入它们

于 2018-06-20T12:13:18.640 回答
0

我找不到它不能与 window.document 一起使用的官方原因,但似乎您也可以使用其他变量重现此行为。问题似乎 Object.keys()不是从这些变量中返回所有内容。

如果您仍在尝试获取文档的所有属性,您仍然可以使用

var props = [];
for(var prop in window.document) {
    props.push(prop);
}
console.log("List props: " + props.sort().join('/'));

这将与您的方法完全相同。

于 2018-06-20T11:56:09.160 回答