知蛛网
  • 首页
  • 会员
  • 活动
  • 工作台

常见问题
活动
关于我们
联系我们
隐私协议
用户协议
会员协议
© 2026 知蛛网. 保留所有权利。
首页会员工作台我的
flynn@flynn
主页wiki简历作品集
目录
全部书籍
00-路线
  • 学习路线
  • 命名与写作规范
01-计算机基础
01-计算机网络
  • 互联网是如何工作的
  • HTTP协议
  • TCP/IP协议
  • 浏览器直接打开本地html文件,请求时的协议问题
02-浏览器原理
  • 浏览器是如何渲染页面的
  • 浏览器是如何渲染页面的
  • 面试之浏览器
03-操作系统
  • 进程与线程
  • 内存管理与虚拟内存
  • IO 模型与多路复用
  • 文件系统与页缓存
04-数据结构与算法
  • 数组与链表
  • 栈与队列
  • 哈希表
  • 树与堆
  • 基础数据结构
01-基础数据结构
02-高级算法
  • 排序算法
  • 二分查找
  • 递归与回溯
  • 动态规划
  • 双指针与滑动窗口
03-leetcode刷题
02-前端核心
01-web开发
  • Web 和 Web 标准
  • web 入门
  • web 开发
  • URL
  • 域名
  • Web服务器
  • 命令行
  • 工作流程和流程
  • 超链接
  • 浏览器指纹
02-html
  • HTML基础语法
  • HTML 概述
  • HTML 发展史
  • HTML调试
  • HTML标题与段落
  • 文本格式化
  • 强调与重要性
  • 块级元素和内联元素
  • 列表
  • 区块
  • 语义元素
  • 页面结构化和语义化
  • 超链接
  • 相对路径和绝对路径
  • 图片
  • 表格
  • 表单和按钮
  • 多媒体
  • 视频/音频
  • HTML 头部
  • HTML 字符集
  • HTML颜色
  • HTML 语言代码
  • HTML 国家/地区
  • Emoji (表情符号)
  • HTML 标签简写及全称 |
  • SVG
  • Canvas 2D
  • Canvas 3D
  • 框架 `<iframe>`
  • HTML 拖放
  • HTML5 Geolocation(地理定位)
  • Web 存储
  • HTML URL 编码
  • MathML
  • 远程图片资源在自己网站中无法展示问题
03-css
  • CSS简介
  • CSS 语法
  • CSS 创建
  • CSS 发展史
  • CSS 浏览器支持
  • CSS 选择器
  • CSS `!important` 规则
  • css颜色
  • CSS 文本格式
  • CSS 盒子模型
  • CSS 尺寸
  • CSS 内边距
  • CSS 外边距
  • CSS 边框
  • CSS 轮廓
  • CSS 背景(background)
  • CSS 溢出
  • CSS 文档流
  • CSS 显示和可见性
  • CSS 浮动
  • CSS 定位
  • CSS 对齐方式
  • CSS 网页布局
  • CSS 多列布局(CSS Multi-column Layout)
  • CSS 透明度
  • CSS 响应式设计(Responsive Design)
  • CSS 媒体查询
  • CSS 列表
  • CSS 表格
  • CSS 表单
  • CSS 链接
  • CSS 用户界面
  • CSS 计数器
  • CSS 过渡
  • CSS 动画
  • CSS 2D 转换
  • CSS 3D 转换
  • CSS 变量(CSS Custom Properties)
  • CSS 原生嵌套(CSS Nesting)
  • CSS 函数(CSS Functions)
04-javascript
  • 什么是 JavaScript?
  • 编程范式(Programming Paradigm)
  • 什么是范式?
  • ECMAScript 规范
  • 什么是语法糖
  • 开发环境搭建
  • 什么是堆和栈?
  • 什么是执行上下文
  • JavaScript 垃圾回收机制
  • 作业队列与事件循环
  • 深拷贝和浅拷贝
  • 语法与类型
  • 字面量
  • 控制流与错误处理
  • 循环与迭代
  • 函数
  • 表达式与运算符
  • 数字和字符串
  • 表达日期与时间
  • 正则表达式
  • 索引集合类
  • 带键的集合
  • 对象
  • 类
  • Promise
  • async/await
  • 迭代器和生成器
  • 国际化
  • 模块
  • 资源管理
  • 属性的可枚举性和所有权
  • 闭包
  • 继承与原型链
  • 元编程
  • 内存管理
  • 内置对象
  • arguments 对象
  • BOM 对象(浏览器对象模型)
  • DOM 对象(文档对象模型)
  • bind、apply、call的区别
  • new 操作符
  • typeof 和 instanceof 的区别
  • HTML5 Web Workers
05-typescript
  • TypeScript 类型系统基础
  • 类型体操
03-框架与跨端
01-react
  • 开发环境搭建
  • JSX
  • 组件
  • 生命周期
  • Hooks
  • 组件通信
  • 状态管理
  • React 19 新特性
  • useCallback 闭包陷阱
  • 常用的性能优化操作
  • Firbe 架构
  • React 18 新特性
  • useRef
  • 基于umijs 4.0 搭建官网
  • react+vite本地开发,如何手机联调
  • React 实现谷歌登录
  • React 项目调起 WhatsApp
02-vue
  • vue 解决跨域请求
  • 在vue2使用TinyMCE富文本编辑器
  • 使用jszip 导出新闻
  • Vue 本地开发启用 https
  • 基于vue3+vite+ts+elementplus+pinia+axios搭建后台管理系统
03-react-native
  • iOS 开发环境(RN 0.72)
  • RN 原生模块(Native Module)
  • 查看Maven包的Java包名
  • 优化 APP 启动速度
  • 安全键盘
  • 启动图与 Icon 尺寸规范
  • RN如何生成/配置iOS的开发者证书和生产证书
  • 邓白氏编码
  • 微信开放平台配置Universal Link
  • 上架至Apple App Store
04-android
  • 开发环境搭建
  • Android项目目录结构
  • 认识Gradle
04-工程化
01-git
  • 如何解决已被git跟踪文件不在跟踪
  • git标签
  • Git报错: Failed to connect to github.com port 443 解决方案
  • Git 分支操作速查
02-构建工具
  • 构建工具原理与选型
02-webpack
  • webpack 核心概念与构建流程
  • webpack 性能优化
03-vite
  • vite 为什么快
  • vite 插件与生产构建
03-测试
  • 前端测试体系
04-部署
  • Nginx 反向代理解决跨域
  • SPA 刷新非首页报 404
05-docker
  • Docker 常用命令
  • docker-compose nginx配置ssl证书
  • Docker Desktop 升级后 docker-compose 命令找不到
06-性能优化
  • 前端性能优化体系
  • 背景 GIF 优化方案
07-微前端
  • 微前端实战(qiankun)
  • 微前端 · qiankun
01-qiankun
05-后端与数据
01-nodejs
  • Node 版本与依赖的 engines 冲突
  • Express 实现 Gmail 发信(邮箱验证码)
02-php
  • 浏览器保存新闻,发布到自有网站
  • [分布式] 浏览器保存新闻,发布到自有网站
  • 邮件发送,多账号轮询
  • nginx和php-fpm通信问题导致网站页面空白
03-python
  • macOS M1 芯片 如何安装 py 和 tkinter
  • tkinter 编写的程序如何打包成桌面软件
04-架构设计
  • 后台管理系统中角色管理、管理员管理、权限设置他们三者之间的关系
05-运维
  • redis启动失败
  • 实现自动备份宝塔项目及数据库到本地
  • 宝塔面板
01-宝塔
06-实战项目
  • 实战准备工作
02-项目记录
  • AI-Chat 模块技术文档
  • CRMChat 部署
07-面试专项
01-面试
  • 面试之自我介绍
  • CSS 面试
  • JS面试
  • React面试
  • Vue面试
  • RN 面试 · 题目清单
  • RN 面试 · 答案详解
  • RN 物流公司 · 题目清单
  • RN 物流公司 · 答案详解
  • Uniapp 面试
  • 带团队经验
12-react专项
  • 一个表格,某一行的某一列数据变动了,如何优化性能?
13-reactnative专项
  • RN 开发过程中,有遇到什么棘手的问题?你是如何解决的?
14-过往面试总结
  • 冷哥传媒 · 面试题
  • 沐腾科技 · 面试题
  • 字符频率排序
02-面试八股
  • 网络八股
  • 浏览器八股
  • 工程化八股
03-算法面试题
  • 前端高频手写题
  • 场景设计题
04-真实面试经历
  • 20251027 盾蓝科技 面试
  • 20251028 芝麻甜心 面试
08-工具
01-n8n
  • 初始n8n
  • 快速入门
  • 在宝塔中搭建n8n环境
  • n8n中常用节点
  • n8n和代码的区别
02-Trae
  • Figma MCP 配置指南
03-UI_UX_pro_max
  • UI_UX_pro_max的使用
04-开发环境
  • VMWare虚拟机安装
  • PowerShell 执行策略与编码设置
98-杂项
  • A股股票交易相关费用
99-手册
  • iOS 开发者账号申请流程及费用
  • 邓白氏编码申请及费用
  • App 推送通道申请及费用
  • App 开发收费项目清单
  • 注册AWS账号
  • 使用Amazon Polly实现文本转语音
  • Google 翻译 Key 申请与前端调用
  • 使用SmsForwarder转发短信

ECMAScript 规范

04-javascript2026/11/14

什么是 ECMAScript?

ECMAScript(简称 ES) 是 JavaScript 语言的官方标准规范,定义了语言的语法、类型、语句、关键字、保留字、操作符、对象等核心特性。

关键关系图:

ECMAScript(标准规范)
       ↓
JavaScript(具体实现)   ← 由浏览器/Node.js等实现
       ↓
TypeScript           ← ES超集,添加类型系统
       ↓
Babel等工具          ← 将新语法转换为旧版本

ECMAScript 版本演进时间线

版本年份代号重大特性现状
ES11997-基础语法、类型、对象已淘汰
ES21998-小修订,与 ISO 标准对齐已淘汰
ES31999-正则表达式、异常处理极少使用
ES4放弃-激进改革(未发布)-
ES52009ES5strict mode、JSON、数组方法广泛支持
ES20152015ES6类、模块、箭头函数、Promise现代 JS 基石
ES20162016ES7指数运算符、Array.includes()成熟
ES20172017ES8async/await、Object.values()成熟
ES20182018ES9异步迭代、Rest/Spread 对象成熟
ES20192019ES10Array.flat()、Object.fromEntries()成熟
ES20202020ES11可选链、空值合并、BigInt广泛支持
ES20212021ES12逻辑赋值、String.replaceAll()广泛支持
ES20222022ES13类字段、顶层 await、.at()方法现代环境支持
ES20232023ES14数组查找方向、Hashbang 语法逐步支持
ES20242024ES15数组分组、RegExp 扩展最新标准

ECMAScript 规范核心结构

1. 语言类型系统

// ECMAScript 类型体系
类型分类:
├── 原始类型 (Primitive Types)
│   ├── Undefined
│   ├── Null
│   ├── Boolean
│   ├── Number
│   ├── BigInt          // ES2020新增
│   ├── String
│   └── Symbol          // ES2015新增
│
└── 对象类型 (Object Types)
    ├── Object
    ├── Function
    ├── Array
    ├── Date
    ├── RegExp
    ├── Error
    ├── Map/Set/WeakMap/WeakSet  // ES2015
    ├── Promise                  // ES2015
    ├── Proxy/Reflect            // ES2015
    ├── ArrayBuffer/TypedArray   // ES2015
    └── 其他内置对象...
上一篇什么是范式?
下一篇什么是语法糖
本页目录
什么是 ECMAScript?关键关系图:ECMAScript 版本演进时间线ECMAScript 规范核心结构1. 语言类型系统2. 执行上下文与作用域3. 对象模型与原型链重要版本特性详解ES5(2009)- 现代 JS 基础ES2015(ES6)- 革命性更新ES2017 - async/awaitES2020+ 重要特性ECMAScript 标准制定流程TC39 提案阶段实际提案示例:装饰器浏览器/引擎实现差异1. JavaScript 引擎对照表2. 兼容性检查代码Babel 编译示例学习与实践建议1. 学习路径2. 生产环境策略3. 资源推荐

类型转换规则(规范第 7 章定义):

// 抽象操作(规范内部概念,开发者不可直接调用)
ToString(argument)        // 转换为字符串
ToNumber(argument)        // 转换为数字
ToBoolean(argument)       // 转换为布尔值
ToPrimitive(argument)     // 转换为原始值
ToObject(argument)        // 转换为对象

// 实际转换示例
null == undefined         // true (规范9.1节)
[] == ![]                 // true (诡异但符合规范)

2. 执行上下文与作用域

// 规范中的执行上下文结构
ExecutionContext = {
  LexicalEnvironment: {     // 词法环境
    EnvironmentRecord: {    // 环境记录
      // 标识符绑定
      [[OuterEnv]]: null | <父环境>  // 作用域链
    }
  },
  VariableEnvironment: { }, // 变量环境(var声明)
  ThisBinding: <值>        // this绑定
}

// 实际代码体现
function outer() {
  var x = 10;              // 进入VariableEnvironment
  let y = 20;              // 进入LexicalEnvironment

  function inner() {
    console.log(x, y);     // 通过作用域链查找
  }

  return inner;
}

3. 对象模型与原型链

// 规范中的对象内部方法
对象内部槽位 = {
  [[Prototype]]: null | 对象,      // 原型链
  [[Extensible]]: true | false,    // 是否可扩展
  [[Get]](P, Receiver),            // 属性访问
  [[Set]](P, V, Receiver),         // 属性设置
  [[OwnPropertyKeys]]()            // 自有属性键
}

// 原型链查找算法(规范9.1.8.1)
function Get(O, P) {
  // 1. 转换为对象
  // 2. 在对象自身上查找属性
  // 3. 如果未找到,检查原型链
  // 4. 返回找到的值或undefined
}

// 实际原型链
const obj = {};
obj.__proto__ === Object.prototype;      // true
Object.getPrototypeOf(obj) === obj.__proto__; // true

重要版本特性详解

ES5(2009)- 现代 JS 基础

// 1. 严格模式
"use strict";
x = 10; // ReferenceError (非严格模式创建全局变量)

// 2. JSON支持
JSON.parse('{"x":1}');
JSON.stringify({ x: 1 });

// 3. 数组方法
[1, 2, 3].forEach(item => console.log(item));
[1, 2, 3].map(x => x * 2);
[1, 2, 3].filter(x => x > 1);
[1, 2, 3].reduce((sum, x) => sum + x, 0);

// 4. 属性描述符
Object.defineProperty(obj, "key", {
    value: "static",
    writable: false, // 不可写
    enumerable: false, // 不可枚举
    configurable: false, // 不可配置
});

ES2015(ES6)- 革命性更新

// 1. 块级作用域
{
    let x = 1; // 块级作用域
    const y = 2; // 常量
}
// x, y 不可访问

// 2. 箭头函数
const add = (a, b) => a + b;
const obj = {
    value: 10,
    getValue: () => this.value, // this指向外层
    getValue2() {
        return this.value;
    }, // 传统方法
};

// 3. 类语法
class Person {
    #privateField = "secret"; // 私有字段(ES2022正式化)

    constructor(name) {
        this.name = name;
    }

    greet() {
        return `Hello, ${this.name}`;
    }

    static create(name) {
        return new Person(name);
    }
}

class Student extends Person {
    constructor(name, grade) {
        super(name);
        this.grade = grade;
    }
}

// 4. 模块系统
// math.js
export const PI = 3.14159;
export function square(x) {
    return x * x;
}
export default class Calculator {}

// app.js
import Calculator, { PI, square } from "./math.js";

// 5. Promise
const fetchData = () =>
    new Promise((resolve, reject) => {
        setTimeout(() => resolve("data"), 1000);
    });

fetchData()
    .then(data => console.log(data))
    .catch(error => console.error(error));

// 6. 解构赋值
const [a, b] = [1, 2];
const { x, y } = { x: 1, y: 2 };
const { z = 3 } = {}; // 默认值

// 7. 模板字符串
const name = "Alice";
const greeting = `Hello, ${name}!
This is a multi-line string.`;

// 8. Symbol
const sym = Symbol("unique");
const obj = { [sym]: "value" };

// 9. 迭代器与生成器
function* idGenerator() {
    let id = 0;
    while (true) {
        yield id++;
    }
}
const gen = idGenerator();
gen.next().value; // 0

ES2017 - async/await

// 异步函数(语法糖,基于Promise)
async function fetchUser(id) {
    try {
        const response = await fetch(`/api/users/${id}`);
        const data = await response.json();
        return data;
    } catch (error) {
        console.error("Fetch failed:", error);
        throw error;
    }
}

// 并行请求
async function fetchAll() {
    const [user, posts] = await Promise.all([fetchUser(1), fetchPosts(1)]);
    return { user, posts };
}

// 规范中的异步执行顺序
async function example() {
    console.log(1);
    await Promise.resolve();
    console.log(2);
    // 微任务队列插入点
}
console.log(3);
example();
console.log(4);
// 输出: 3, 1, 4, 2

ES2020+ 重要特性

// 1. 可选链操作符
const street = user?.address?.street;
const result = obj.method?.();

// 2. 空值合并运算符
const value = input ?? "default"; // 仅当null/undefined时用默认值

// 3. BigInt
const big = 9007199254740991n; // 超过Number.MAX_SAFE_INTEGER
const bigger = big + 1n;

// 4. 全局对象统一
// 浏览器: window, Node.js: global, 统一访问:
globalThis.setTimeout(() => {}, 1000);

// 5. Promise.allSettled
const promises = [Promise.resolve(1), Promise.reject("error")];
Promise.allSettled(promises).then(results => {
    // [{status: "fulfilled", value: 1}, {status: "rejected", reason: "error"}]
});

// 6. 动态导入
const module = await import("./module.js");
if (condition) {
    const utils = await import("./utils.js");
}

// 7. 私有类字段(ES2022正式化)
class Counter {
    #count = 0; // 真正的私有

    increment() {
        this.#count++;
    }

    getCount() {
        return this.#count;
    }
}

// 8. 顶层await(ES2022)
// 模块中可以直接使用await
const data = await fetchData();
export { data };

ECMAScript 标准制定流程

TC39 提案阶段

阶段0: Strawman(草案) → 阶段1: Proposal(提案)
       ↓                           ↓
阶段2: Draft(草案规范) → 阶段3: Candidate(候选)
       ↓                           ↓
阶段4: Finished(完成)  → 纳入下一版ECMAScript

实际提案示例:装饰器

// 阶段3提案(2024年更新)
// 旧语法(已废弃)
@decorator
class MyClass {}

// 新语法提案
class MyClass {
    @decorator accessor myField = 1;

    @decorator
    myMethod() {}
}

// 装饰器实现示例
function logged(target, context) {
    return function (...args) {
        console.log(`调用 ${context.name}`, args);
        return target.call(this, ...args);
    };
}

class Calculator {
    @logged
    add(a, b) {
        return a + b;
    }
}

浏览器/引擎实现差异

1. JavaScript 引擎对照表

引擎浏览器/环境ECMAScript 兼容性
V8Chrome, Node.js, Edge最新特性支持最好
SpiderMonkeyFirefox紧跟标准,实现质量高
JavaScriptCoreSafari较保守,但符合标准
Chakra (已弃用)旧版 Edge已被 V8 取代

2. 兼容性检查代码

// 特性检测(而非浏览器检测)
function supportsES2020() {
    try {
        // 检查可选链
        eval("const obj = {}; obj?.property");

        // 检查空值合并
        eval('null ?? "default"');

        // 检查Promise.allSettled
        if (!Promise.allSettled) return false;

        // 检查BigInt
        if (typeof BigInt === "undefined") return false;

        return true;
    } catch {
        return false;
    }
}

// 使用polyfill策略
if (typeof Promise.allSettled === "undefined") {
    Promise.allSettled = function (promises) {
        return Promise.all(
            promises.map(p =>
                p.then(
                    value => ({ status: "fulfilled", value }),
                    reason => ({ status: "rejected", reason })
                )
            )
        );
    };
}

Babel 编译示例

// 源代码(ES2022+)
class User {
    #password = "secret";

    static async create(data) {
        const user = new User();
        await user.#validate(data);
        return user;
    }

    async #validate(data) {
        // 私有方法
    }
}

const name = user?.profile?.name ?? "Anonymous";

// Babel转译后(ES5兼容)
("use strict");

function _classPrivateFieldInitSpec(obj, privateMap, value) {
    // 私有字段polyfill
}

function _checkPrivateRedeclaration(obj, privateCollection) {
    // 私有成员检查
}

var User = /*#__PURE__*/ (function () {
    function User() {
        _classPrivateFieldInitSpec(this, _password, {
            writable: true,
            value: "secret",
        });
    }

    User.create = function create(data) {
        return Promise.resolve().then(function () {
            var user = new User();
            return _validate.call(user, data).then(function () {
                return user;
            });
        });
    };

    var _password = new WeakMap();

    var _validate = /*#__PURE__*/ (function () {
        function _validate(data) {
            return Promise.resolve();
        }
        return _validate;
    })();

    return User;
})();

var name =
    (user == null ? void 0 : user.profile == null ? void 0 : user.profile.name) ?? "Anonymous";

学习与实践建议

1. 学习路径

初学者:ES5 基础 → ES6 核心 → 现代特性
进阶者:阅读 ES 规范 → 理解引擎实现 → 性能优化
专家级:参与 TC39 提案 → 开发 Babel 插件 → 引擎开发

2. 生产环境策略

// package.json配置示例
{
  "browserslist": [
    "> 1%",            // 全球使用率>1%的浏览器
    "last 2 versions", // 最近两个版本
    "not dead"         // 未废弃的浏览器
  ],
  "devDependencies": {
    "@babel/core": "^7.0.0",
    "@babel/preset-env": "^7.0.0", // 智能polyfill
    "core-js": "^3.0.0"            // 标准库polyfill
  }
}

// .babelrc配置
{
  "presets": [
    ["@babel/preset-env", {
      "useBuiltIns": "usage",  // 按需引入polyfill
      "corejs": 3,
      "targets": {
        "chrome": "58",
        "ie": "11"             // 明确IE支持
      }
    }]
  ]
}

3. 资源推荐

  • 规范文档: ECMA-262 标准
  • 提案状态: TC39 GitHub
  • 兼容性表: Can I Use
  • 测试工具: ES6 兼容性表
  • 学习资源: MDN JavaScript