You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何该逻辑表达式返回全局对象?控制台输出Window对象疑问

为什么这段逻辑表达式会返回全局对象?

这个问题问得很到位!咱们来一步步拆解这段代码,看看它在浏览器里为啥会返回Window对象~

首先先把代码贴出来方便分析:

var root = (typeof self == 'object' && self.self === self && self) || (typeof global == 'object' && global.global === global && global);
console.log(root); // 浏览器中输出Window对象

核心逻辑:利用||的短路特性

JavaScript里的逻辑或||是短路求值的——从左到右依次判断,只要左边的表达式能返回“真值”,就直接返回左边的值,不会再执行右边的代码。这段代码就是靠这个特性,优先尝试获取浏览器环境的全局对象,失败了再去拿Node.js环境的全局对象。

拆解左边的self判断分支

在浏览器环境里,这个分支会先被触发:

  • typeof self == 'object':浏览器里的self是全局Window对象的一个引用,它的类型确实是object,这个条件成立。
  • self.self === self:全局对象的self属性指向它自己(Window.self就是Window),所以这个全等判断也成立。
  • 逻辑与&&也是短路求值,当前面两个条件都为真时,会返回最后一个操作数——也就是self,也就是Window对象。

因为左边已经返回了一个“真值”(Window对象在布尔判断里是真),所以||直接把这个值赋值给root,右边的global分支根本不会被执行。

为什么要加self.self === self?

这是个很巧妙的校验!它能过滤掉那些名字叫self但不是全局对象的情况——比如你在某个函数里定义了一个局部变量var self = {},这个self的self属性是undefined,肯定不等于自身,这样就能确保我们拿到的是真正的全局对象,而不是同名的局部变量。

补充:Node.js环境的情况

如果在Node.js里运行这段代码,self是不存在的,左边的分支会返回false,这时候就会执行右边的global分支:判断global是对象,且global.global === global(Node的全局对象global的global属性指向自身),最后返回global对象。

内容的提问来源于stack exchange,提问作者Salman Sarray

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:49:24