🧱 ES3(1999)

一句话定性

ES3 是 JavaScript 的**“地基浇筑”版本**:它本身没有任何耀眼的创新,但它第一次足够完整、又恰好被 IE6 锁死了整整十年——于是它成了 jQuery 这代库赖以生存的”最大公约数”,也成了一代前端工程师的”原生语言”。


一、它是什么 & 出现的时代

ES3 发布于 1999 年 12 月,是 ECMAScript 标准的第三版(ES1/ES2 太早、太基础,几乎没人记得)。它出现在 第一次浏览器战争的尾声——IE 即将凭借捆绑分发碾压 Netscape,IE5/IE6 实现的就是 ES3

这个时间点至关重要:IE6(2001)拿下 90%+ 市场后,微软几乎停止了浏览器创新长达五年。结果是,IE6 所支持的 ES3,事实上成了”网页能跑的 JavaScript”的天花板,一锁就锁到了 2009 年 ES5 出现、甚至 2015 年 IE6 退场

为什么我们今天还在意 ES3?

因为整个 Ajax 时代jQuery 的黄金期,开发者实际可用的语言就是 ES3。你写的所有 JS,最终都要能在只懂 ES3 的 IE6/7/8 上跑。这条隐形的天花板,定义了那十年前端的全部代码风格。


二、为什么会出现(解决上一代什么痛点)

ES1(1997)只是把语言”标准化”了,但它非常基础——连正则表达式像样的异常处理都没有。在真实业务里:

  • 表单校验需要正则,但 ES1 没有 RegExp,只能用蹩脚的字符串拼接。
  • 代码出错只能整页崩溃,没有 try/catch 来优雅处理。
  • 字符串/数组操作方法太少,处理数据极其啰嗦。

ES3 就是来补这些”日常刚需”的。它不追求革命,只追求**“让 JS 能干正经活”**。


三、关键特性 & 为什么重要

特性解决了什么实际问题
正则表达式 RegExp表单校验、字符串匹配的刚需。没有它,验证一个邮箱地址都是噩梦
try/catch/finally 异常处理让错误可以被捕获和恢复,而不是整页脚本崩溃
switch 语句多分支逻辑的标准写法
do-while 循环补全循环结构
更丰富的 String 方法split(支持正则)、replace(支持正则+回调) 等,数据处理能力质变
Function.prototype.apply/call这是 jQuery 时代的隐形支柱:借用方法、改变 this 指向、处理 arguments,几乎所有库都重度依赖它

ES3 最深远的影响:它"够用"且"被冻结",于是催生了"库的时代"

ES3 本身能力有限——没有模块、没有 class、没有 Promise、没有原生的 forEach。但它稳定、可预测、到处都一样。这反而创造了一个机会:既然语言十年不变,那就用来填补它的不足。

jQuery 正是 ES3 的产物:它用 ES3 仅有的工具(apply/call、原型链、闭包),封装出 $() 选择器、链式调用、动画、Ajax——把”抹平浏览器差异”和”补齐语言缺失”打包成了一个库。可以说,ES3 的”贫瘠”是 jQuery 繁荣的土壤。


四、带来的新问题 / 副作用

ES3 的"够用"也是一种诅咒

  1. 十年停滞的天花板:因为 IE6 锁死在 ES3,即便 ES5(2009)发布了,开发者也多年不敢用——只要还要兼容 IE,你就只能写 ES3。语言进步与现实可用之间裂开了巨大的鸿沟。
  2. 没有模块系统:所有代码都是全局变量,大型项目靠”命名空间对象 + IIFE(立即执行函数)“勉强隔离,污染和冲突是家常便饭。这个空缺直接催生了后来的 AMD 模块大战
  3. 没有原生迭代/函数式方法:forEachmapfilter 都没有,只能 for (var i...) 手写循环——这也是 jQuery 的 $.each 大行其道的原因。
  4. 语言坑全部保留:var 提升、this 丢失、== 陷阱在 ES3 里一应俱全,且因为兼容性永远无法修复。

五、对后续技术的影响(因果链)

ES3 (1999) 第一个"够用"的版本
        │
        ├──► 恰好被 IE6 实现并锁死十年 (2001~2014)
        │           │
        │           ↓
        │     成为"网页能跑的 JS"的事实天花板
        │           │
        │           ├──► 语言贫瘠(无模块/无 class/无 forEach)
        │           │         │
        │           │         ↓
        │           │   用"库"填补语言空缺 ──► [[jQuery]] (2006) 称王
        │           │                          (apply/call + 原型链 + 闭包)
        │           │
        │           └──► 全局变量泛滥,无模块 ──► 催生模块化需求 ──► [[ES-Modules]]
        │
        ↓
ES3 停滞十年的痛苦 ──► 直接定义了 [[ES5]](2009)的务实目标:
                       "先把日常缺失的工具补齐"

历史地位

ES3 是 JavaScript 的”经典力学时代”:简单、稳定、无处不在,也充满局限。它最大的历史意义在于——因为它十年不变,前端被迫在”库”这个层面创新,于是有了 jQuery 这样定义一个时代的作品。当你理解了”为什么 jQuery 必须存在”,你就理解了 ES3 那份”贫瘠的稳定”在历史上的位置。


🔗 时代背景:1995-2005 浏览器时代 | 2005-2013 Ajax时代 🔗 版本脉络:ECMAScript演进史 | 下一版 → ES5 🔗 相关:jQuery | ES-Modules