那天晚上,我在公司楼下的便利店买咖啡。写代码写了一整天,大脑已经有点“缓存溢出”的感觉。正准备回家时,隔壁工位的小伙伴突然在群里问了一句:“小米,JavaScript 里的 Global 对象 到底是个啥?为什么有些函数不用声明就能直接用?”
我看着手机笑了笑。这个问题,其实特别像我们每天生活的一个东西城市的公共设施。
于是我决定给他讲个故事。
Global单例内置对象:城市的“公共服务中心”
想象一下,你住在一座城市里。城市里有很多公共设施:
- 邮局
- 公路
- 电力系统
- 派出所
- 公共广播
这些东西有个特点:任何人都可以直接使用,不需要自己建一套。JavaScript 里的 Global 对象 就是这样一个存在。
在 JavaScript 运行环境中,Global 是一个 顶层对象,它像是一个“公共服务中心”,里面放着很多系统级工具,比如:
- parseInt
- parseFloat
- isNaN
- encodeURI
- decodeURI
- eval
- Infinity
- NaN
- undefined
这些东西之所以我们能直接调用,比如:
其实本质上都是:
只是 JavaScript 帮我们省略了 global 前缀。就像城市里的路灯一样,你不会每次开灯都说:“我现在使用城市公共照明系统。”,你直接走在路上就行了。
Global 就是这样一个 单例对象,整个 JavaScript 运行环境只有一个。
URL 编码方法:给地址“翻译成国际语言”
故事继续。有一次我在做一个搜索功能,URL 长这样:https://example.com/search?keyword=小米手机
浏览器一访问,服务器直接懵了。
为什么?因为 URL 其实只能安全传输 ASCII 字符。而“中文、空格、特殊符号”都需要编码。这时候 Global 就提供了两对非常重要的工具:
1、encodeURI()
用于 编码完整URL
结果:
https://example.com/search?keyword=%E5%B0%8F%E7%B1%B3%E6%89%8B%E6%9C%BA
注意,encodeURI不会编码URL结构符号,比如:
- :
- /
- ?
- =
因为这些是 URL 的语法。就像寄快递时:地址结构不能改,只翻译内容。
2、encodeURIComponent()
如果你只想编码 参数部分,就要用这个:
结果:
%E5%B0%8F%E7%B1%B3%20%E6%89%8B%E6%9C%BA
区别非常简单:
3、解码方法
Global 还提供了两个反向工具:
- decodeURI()
- decodeURIComponent()
就像:翻译 → 再翻译回来
eval()方法:JavaScript 的“魔法咒语”
讲到这里,我突然想起了 JavaScript 世界里最神秘的一个函数:eval()
如果说 Global 是城市服务中心,那 eval() 就像一位 魔法师。它可以把字符串 当作 JavaScript 代码执行。
举个例子:eval("console.log('Hello JavaScript')");
运行结果:Hello JavaScript
再来个更刺激的:
输出:30
也就是说:字符串 → 直接变代码执行,是不是有点黑魔法的感觉?
但为什么大家都说不要用?因为它有两个大问题:
1、安全问题
如果代码来自用户输入:eval(userInput)
那攻击者可能输入:deleteAllDatabase()
那可就不是开玩笑了。
2、性能问题
JavaScript 引擎在编译代码时,会做很多优化。但只要出现 eval(),引擎就会想:“等等,这段代码可能会动态生成变量…”,于是很多优化都会 失效。
所以现代开发里有一句经典建议:永远不要使用 eval(),除非你非常清楚自己在干什么。
Global对象属性:JavaScript 的“系统常量”
除了函数,Global 里还有一些 系统级属性。就像城市里的 公共规则。最常见的有:
1、Infinity
代表 无穷大
console.log(1/0)
输出:Infinity
2、NaN
代表 不是数字
console.log(0/0)
输出:NaN
经典判断:isNaN("abc")
返回:true
3、undefined
变量未定义时的值
结果:undefined
4、globalThis
这是 ES2020 新加入的一个统一入口。因为不同环境里 Global 对象名字不同:

为了统一,JavaScript 新增:globalThis
例子:console.log(globalThis)
这样无论在什么环境都能访问 全局对象。
window对象:浏览器里的Global
讲到最后,小伙伴突然问:“那浏览器里的 window 是啥?”
我笑了。其实在 浏览器环境中:window === Global 对象
也就是说:parseInt("123")
其实就是:window.parseInt("123")
再比如:varname="小米";
等价于:window.name ="小米";
也就是说:全局变量其实是 window 的属性。
举个例子
输出:31,但如果用 let 或 const:
结果:undefined
原因是:
- var → 挂到 window
- let/const → 不会挂
总结一下
如果把 JavaScript 世界比作一座城市:
而我们每天写的 JavaScript 代码,其实就像在这座城市里生活。你不需要自己造路灯、修公路、建邮局。因为 Global 已经帮你准备好了所有公共设施。
所以当你下一次写下:parseInt("123"),或者encodeURI(url),记得一件事:你其实正在使用 JavaScript 世界里那个 默默工作的“超级单例”——Global 对象。
它就像城市里永远亮着灯的那栋大楼。平时你不会注意它。但整个世界,都离不开它。
END
好朋友们,我们下篇见~
我是小米,一个喜欢分享技术的31岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货!