JavaScript window 对象

在浏览器环境中,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 作为 “浏览器窗口”

简单来说,JavaScript 会把一个窗口看成一个对象,这样我们就可以用这个对象的属性和方法来操作这个窗口。实际上,我们每次打开一个页面时,浏览器都会自动为这个页面创建一个 window 对象。

window 对象存放了这个页面的所有信息,为了更好分类处理这些信息,window 对象下面又分为很多对象,如下图以及下表所示。

JavaScript 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 对象也有非常多的方法,常用的如下表所示。

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 作为全局对象,此时它代表的是最顶层的对象。对于全局对象,它常用的属性如下表所示。

JavaScript 全局对象的属性
方法 说明
globalThis 全局的 this 值
undefined 表示变量已声明但未赋值
null 表示变量被显式地赋予 “空值”
NaN 表示非数字值
Infinity 表示无限值

而全局对象的方法有很多,常用的如下表所示。

JavaScript 全局对象的方法
方法 说明
setTimeout() 延迟指定时间后,执行一次函数或代码
setInterval() 以指定间隔时间,重复执行函数或代码
clearTimeout() 取消先前由 setTimeout() 设置的定时任务
clearInterval() 取消先前由 setInterval() 设置的重复定时任务
parseInt() 将字符串转换为整数
parseFloat() 将字符串转换为浮点数
isNaN() 判断值是否为非数字
isFinite() 判断值是否为有限数字(既不是 Infinity 也不是 NaN)
eval() 将字符串的内容作为 JavaScript 代码执行
encodeURI() 对 “整个 URI” 进行编码
encodeURIComponent() 对 “URI 某个组件” 进行编码
decodeURI() 对已编码的 “整个 URI” 进行解码
decodeURIComponent() 对已编码的 “URI 某个组件” 进行解码

提示: eval() 在现代开发中是被视为 “Evil(邪恶的)” 的,因为它本身存在严重的安全风险和性能问题。在实际开发中,我们强烈不推荐使用。

给站长反馈

绿叶网正在不断完善中,小伙伴们如果发现任何问题,还望多多给站长反馈,谢谢!

邮箱:lvyenet@vip.qq.com

「绿叶网」服务号
绿叶网服务号放大
关注服务号,微信也能看教程。
绿叶网服务号