window.Object != Object 用于 greasemonkey 脚本

window.Object != Object for greasemonkey script

以下脚本将 false 记录到控制台。有谁知道为什么或它带来了什么好处?

通过快速浏览 Greasemonkey 的源代码,我找不到任何修改 Object 的内容。另外查看 Object 很难看出任何有意义的差异,所有功能仍然是本机代码。

// ==UserScript==
// @name        test
// @namespace   test
// @include     *
// @grant       none
// ==/UserScript==

console.log(window.Object == Object)

(在 Greasemonkey 和 Firefox 上测试,不确定 Scriptish 和 Chrome,但欢迎任何实验!)。

[注意:此问题与 {a: 2} != {a: 2} 的问题 无关,请阅读问题本身,而不要在投票前只看一眼标题,谢谢!]。

这是 Mozilla 当前沙盒进程的副作用。即使在 @grant none 模式下,Greasemonkey 沙箱脚本也使用 Components.utils.Sandbox -- 仅在 Xray 关闭且 wantExportHelpers 留在 false.

因此,您的 window.Object == Object 相当于 window.Object == this.Object
但是:在 Greasemonkey 脚本中,this(root/global this)总是一个 Sandbox 对象,而不是 Window.

Firefox 可能有充分的理由像这样克隆 Object,但我找不到任何参考资料说明这一点。


Chrome+Tampermonkey 不会执行此操作 并且 window.Object == Object 对于 Tampermonkey 脚本是正确的,无论 @grant 设置如何。

Chrome 也不会以同样的方式进行沙盒处理。