【问题标题】:How to enumerate *all* Javascript globals in a browser?如何在浏览器中枚举 *all* Javascript 全局变量?
【发布时间】:2021-05-04 22:08:41
【问题描述】:

我正在寻找一种以编程方式获取浏览器全局变量列表的方法,包括诸如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. 如果做不到这一点,是否有特定于浏览器的编程方式来实现这一点?

【问题讨论】:

  • 对象的属性不必是可枚举的

标签: javascript browser global-variables introspection


【解决方案1】:

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

【讨论】: