如何在浏览器中枚举 *all* Javascript 全局变量?

How to enumerate *all* Javascript globals in a browser?

我正在寻找一种编程方式来获取浏览器全局列表,包括 ArrayObject 等内置构造函数

如果我在 Chrome 控制台中键入 Javascript,我会得到这种有点奇怪的行为:

console.log('Array' in globalThis);  // true

const s = new Set(function*() { for (const key in globalThis) yield key; }());
console.log(s.has('Array'));  // false

也就是说,我可以检查 Array 构造函数是否在全局对象中,但是当我枚举其成员时 Array 构造函数不存在。

我的问题:

  1. 为什么我的枚举键的方法不起作用?

  2. 是否有编程和跨浏览器的方式(只有常青浏览器是可以的)来枚举每个可通过 globalThis 访问的成员?

  3. 如果做不到这一点,是否有特定于浏览器的程序化方法来完成此操作?

@NiettheDarkAbsol 在并非所有属性都是可枚举的评论中是正确的。事实证明,通过使用 Object.getOwnPropertyNames()(如果需要,还可以使用 Object.getOwnPropertySymbols())获取直接属性,无论如何都可以枚举“不可枚举”的属性。如果您还需要继承属性,则需要在原型链上执行此操作。