`typeof window === 'object'` 总是正确的吗?

Will `typeof window === 'object'` always be true?

假设 window 没有隐藏,typeof window === 'object' 会永远为真吗?这样安全吗?

上下文:我正在尝试使用 browserify 将模块导出到全局范围,我想包含一个检查以查看该模块是否在浏览器中 运行,如果是,我想将其导出到全局对象。

为了将变量添加到全局范围,browserify 公开了 global,在浏览器中表示 window

Per the browserify docs(强调我的)

Additionally, if you use any of these variables, they will be defined in the bundled output in a browser-appropriate way:

  • process
  • Buffer
  • global - top-level scope object (window)
  • __filename - file path of the currently executing file
  • __dirname - directory path of the currently executing file

就被问的问题而言:

Assuming window isn't shadowed, will typeof window === 'object' always be true?

Yes 鉴于它在浏览器环境中 运行。

如果你有真正的window,由运行时定义,它将永远是一个对象。 typeof operator (§12.5.6) has a limited number of return values (table 15)window 没有特别的。如果他们扩展 table,它可能会改变,但在 ES1 到 ES7 中唯一适用的结果是 'object'

请记住,Node 根本没有定义 window(因此 typeof 将是 'undefined'),您可以像您提到的那样隐藏它。在具有标准 DOM 实现的浏览器中,window 将是 §7.3 of the DOM specification 中定义的对象。对于 JavaScript,这应该是一个对象,我相信所有浏览器都将其公开。

在 webpack 中,您可以使用 output.library 属性 并将 output.libraryTarget 设置为 'var',然后 bundle 会为您设置全局。我想 browserify 有一个等价物。

答案是:视情况而定。

简答:

如果您在浏览器中,那么是的,window 将始终是一个对象。如果您使用 JavaScript 独立引擎,例如 Node.js,那么可能不会。

更多详情:

A window 是浏览器上的顶级对象之一。它是存在于浏览器 window(或选项卡)中的整个 DOM 树的父级,以及大多数函数和事件侦听器经常 运行.[=16= 的上下文引用]

所以在任何期望正常工作的浏览器中,都会有一个window对象。 (一些 side/experimental 项目可能已经修改了 JavaScript 引擎并且没有实现 window,但这是极不可能的,而且绝对不是将要使用的那种东西"mainstream users")

但是,当我们谈论 JavaScript 引擎 运行 在浏览器之外时,情况会有所不同。在服务器端 JavaScript 运行 时,例如 Node.js,其目的是不使用 windows/tabs、URL 和 DOM 树解析,例如浏览器做。因此,您将无法使用此对象,并且 运行ning typeof window 将在这些环境中 return 'undefined'