在浏览器环境中,window 对象其实有 2 个身份:
- 浏览器窗口(BOM):此时它代表了一个浏览器窗口。通过 window 对象,我们可以控制浏览器窗口的大小、位置、打开新窗口等功能。
- 全局对象(Global Object):此时它代表 JavaScript 运行环境中的最顶层对象。所有全局函数、内置对象(如 Math, Array)等,本质上都是 window 对象的属性。
了解 window 对象的 “双重身份” ,对于我们理解 JavaScript 是非常重要的。很多初学者甚至包括一些工作了的小伙伴,就是没有真正深入这一点,才会对 window 对象有一种 “云里雾里” 的感觉。
提示: 使用 let 或 const 声明的全局变量不会挂载到 window 对象上,只有使用 var 声明的全局变量才会挂载到 window 对象上。
JavaScript window 作为 “浏览器窗口”
在浏览器环境中,一个浏览器窗口就是一个 window 对象(这句话很重要)。比如下图所示有 3 个窗口,此时表示有 3 个不同的 window 对象。

简单来说,JavaScript 会把一个窗口看成一个对象,这样我们就可以用这个对象的属性和方法来操作这个窗口。实际上,我们每次打开一个页面时,浏览器都会自动为这个页面创建一个 window 对象。
window 对象存放了这个页面的所有信息,为了更好分类处理这些信息,window 对象下面又分为很多对象,如下图以及下表所示。

| 子对象 | 说明 |
|---|---|
| document | 文档对象,用于操作页面元素 |
| location | 地址对象,用于操作 URL 地址 |
| navigator | 浏览器对象,用于获取浏览器版本信息 |
| history | 历史对象,用于操作浏览历史 |
| screen(较少用) | 屏幕对象,用于操作屏幕宽度高度 |
你没看错,document 对象也是 window 对象下的一个子对象。很多人以为一个窗口就是一个 document 对象,其实这个理解是错的。因为一个窗口不仅仅包括 HTML 文档,还包括浏览器信息、浏览历史、浏览地址等等。而 document 对象仅仅专门用来操作我们 HTML 文档中的元素。用一句话概括就是:“一个窗口就是一个 window 对象,这个窗口里面的 HTML 文档就是一个 document 对象,document 对象是 window 对象的子对象。”
window 对象及下面这些 location、navigator 等子对象,由于都是操作浏览器窗口的,所以我们又称之为 “BOM”,也就是 Browser Object Model(浏览器对象模型)。BOM 这个术语很常见,我们至少要知道它是什么意思。BOM 和 DOM 都是 “某某对象模型”,所谓的对象模型,可以简单理解为把它们看成一个对象来处理。
此外,你也可以把 window 下的子对象看成是它的属性,只不过这个属性也是一个对象,所以我们才称之为 “子对象”。
对象一般都有属性和方法,上表介绍的是 window 对象的属性。实际上,window 对象也有非常多的方法,常用的如下表所示。
| 对话框 | |
| alert() | 提示对话框 |
| confirm() | 确认对话框 |
| prompt() | 输入对话框 |
| 窗口控制 | |
| open() | 打开窗口 |
| close() | 关闭窗口 |
| scrollTo() | 滚动到指定位置 |
对于 window 对象来说,无论是它的属性,还是方法,都可以省略 window 前缀。例如 window.alert() 可以简写为 alert(),window.open() 可以简写为 open(),甚至 window.document.getElementById() 可以简写为 document.getElementById(),以此类推。
window 对象的属性和方法是非常多的,但是大多数都用不上。在这一章中,我们只针对最实用的来讲解,掌握好这些已经完全够了,其他的属性和方法,可以直接忽略掉。
注意: Node.js 环境是不存在 window 对象的,它只有 global 对象(或 globalThis 对象)。
JavaScript window 作为 “全局对象”
当 window 作为全局对象,此时它代表的是最顶层的对象。对于全局对象,它常用的属性如下表所示。
| 方法 | 说明 |
|---|---|
| globalThis | 全局的 this 值 |
| undefined | 表示变量已声明但未赋值 |
| null | 表示变量被显式地赋予 “空值” |
| NaN | 表示非数字值 |
| Infinity | 表示无限值 |
而全局对象的方法有很多,常用的如下表所示。
| 方法 | 说明 |
|---|---|
| setTimeout() | 延迟指定时间后,执行一次函数或代码 |
| setInterval() | 以指定间隔时间,重复执行函数或代码 |
| clearTimeout() | 取消先前由 setTimeout() 设置的定时任务 |
| clearInterval() | 取消先前由 setInterval() 设置的重复定时任务 |
| parseInt() | 将字符串转换为整数 |
| parseFloat() | 将字符串转换为浮点数 |
| isNaN() | 判断值是否为非数字 |
| isFinite() | 判断值是否为有限数字(既不是 Infinity 也不是 NaN) |
| eval() | 将字符串的内容作为 JavaScript 代码执行 |
| encodeURI() | 对 “整个 URI” 进行编码 |
| encodeURIComponent() | 对 “URI 某个组件” 进行编码 |
| decodeURI() | 对已编码的 “整个 URI” 进行解码 |
| decodeURIComponent() | 对已编码的 “URI 某个组件” 进行解码 |
提示: eval() 在现代开发中是被视为 “Evil(邪恶的)” 的,因为它本身存在严重的安全风险和性能问题。在实际开发中,我们强烈不推荐使用。
