多个JavaScript realm是否可以共享同一个全局对象?
核心结论
如果arg是在其他realm中创建的,arg instanceof Array完全有可能返回true,ECMAScript规范确实没有保证这种场景不会出现。
具体逻辑说明
- 先理清楚
instanceof的工作规则:它本质是检查右侧构造函数的prototype属性,是否出现在左侧实例的原型链上。 - ECMAScript规范只要求每个realm需要关联自己的全局对象和对应的内置对象集,但从来没有禁止不同realm共享内置对象的引用:
- 我们平时常见的跨realm场景(比如浏览器同域iframe、Node.js的vm模块创建的独立上下文)里,宿主都会给每个realm生成完全独立的全套内置对象,所以跨realm的数组用
instanceof Array判断会返回false,这是通用实现的常规结果,不是规范强制要求的。 - 只要宿主实现愿意,完全可以让多个realm的
Array构造函数、Array.prototype指向同一个引用,这种情况下其他realm创建的数组,在当前realm下调用arg instanceof Array就会返回true。你提到的多realm共享同一个全局对象的场景,本身也是规范允许的实现方式。
- 我们平时常见的跨realm场景(比如浏览器同域iframe、Node.js的vm模块创建的独立上下文)里,宿主都会给每个realm生成完全独立的全套内置对象,所以跨realm的数组用
实用建议
如果你需要不受realm影响的数组类型判断,直接用Array.isArray(arg)就可以,这个API就是专门为了解决跨realm类型判断的问题设计的,结果稳定可靠。
内容的提问来源于stack exchange,提问作者Ilya Loskutov
相关产品推荐
相关产品推荐

