如何在浏览器中枚举 *all* Javascript 全局变量?
How to enumerate *all* Javascript globals in a browser?
我正在寻找一种编程方式来获取浏览器全局列表,包括 Array
、Object
等内置构造函数
如果我在 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
构造函数不存在。
我的问题:
为什么我的枚举键的方法不起作用?
是否有编程和跨浏览器的方式(只有常青浏览器是可以的)来枚举每个可通过 globalThis
访问的成员?
如果做不到这一点,是否有特定于浏览器的程序化方法来完成此操作?
@NiettheDarkAbsol 在并非所有属性都是可枚举的评论中是正确的。事实证明,通过使用 Object.getOwnPropertyNames()
(如果需要,还可以使用 Object.getOwnPropertySymbols()
)获取直接属性,无论如何都可以枚举“不可枚举”的属性。如果您还需要继承属性,则需要在原型链上执行此操作。
我正在寻找一种编程方式来获取浏览器全局列表,包括 Array
、Object
等内置构造函数
如果我在 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
构造函数不存在。
我的问题:
为什么我的枚举键的方法不起作用?
是否有编程和跨浏览器的方式(只有常青浏览器是可以的)来枚举每个可通过
globalThis
访问的成员?如果做不到这一点,是否有特定于浏览器的程序化方法来完成此操作?
@NiettheDarkAbsol 在并非所有属性都是可枚举的评论中是正确的。事实证明,通过使用 Object.getOwnPropertyNames()
(如果需要,还可以使用 Object.getOwnPropertySymbols()
)获取直接属性,无论如何都可以枚举“不可枚举”的属性。如果您还需要继承属性,则需要在原型链上执行此操作。