ECMAScript
JavaScript语言的核心特性是在 ECMA-262 标准中定义
Last updated
JavaScript语言的核心特性是在 ECMA-262 标准中定义
Last updated
2007年,Ajax 的流行开启了动态 Web 应用的新时代,而此时的 JavaScript 正站在一个十字路口。自 1999 年第三版 ECMA-262 发布以来,JavaScript 就没发生过变化。
那时 ECMAScript 4 引入了非常多的规范草案,包括类、模块、经典继承、私有对象方法、可选类型注释、新语法等大大小小的特性。关于 ECMAScript 的更改范围,TC-39 里有两种不同的意见,其中一方认为这个版本试图完成的太多了,他们创建了一个替代提案 ECMAScript 3.1,旨在对现有标准进行增量更改。双方最终没有达成一致,因为他们对语言如何发展有非常不同的观点。
大规模修改 vs 增量修改
2008年,JavaScript 语言之父 Brendan Eich 宣布 TC-39 将专注标准化 ECMAScript 3.1。他们将列出 ECMAScript 4 里主要的语法和特性更改,也会将 ECMAScript 3.1 和 4 的最佳部分整合在一起。ECMAScript 3.1 最终被标准化为 ECMA-262 的第五版,也称 ECMAScript 5。
ECMAScript 4 从未被发布,以免造成混淆。
2015 年,ECMAScript 6 达到了功能完善的状态,被正式命名为 ECMAScript 2015,也简称 ES6。此版本的特性差异巨大,从全新的对象和模式到对现有对象新方法的语法更改,最重要的是它的所有更改都是为了解决开发人员所面临的实际问题。
ECMAScript 6 的开发用了大约四年,TC-39 也意识到周期太长了不好,所以他们改成了每年发布一版以确保新的语言特性能更快地进入开发阶段。更频繁的发布也就意味着 ECMAScript 的每个新版本的新特性都会比 ECMAScript 6 里的少,为了表示这一变化,规范的新版本不再突出版本号而是发布的年份。所以,ECMAScript 6 也叫 ECMAScript 2015,ECMAScript 7 也被正式称为 ECMAScript 2016,TC-39 期望在未来的所有 ECMAScript 版本中使用基于年份的命名系统。
全局的 undefined
, NaN
, Infinity
对应的对象
String 的属性和方法
支持 []
访问
String.prototype.split()
String.prototype.substr()
String.prototype.trim()
Number.prototype.toExponential()
优化
静态方法
Function.prototype.bind()
Function.prototype.apply()
支持类数组
thrown function(){}
有正确的 this 值
函数的 prototype
属性是不可枚举的
函数 arguments 参数 toStringTag 的值是 'Arguments'
Array 的方法
Date 的属性和方法
Date.now
Date.prototype.toJSON()
Date.prototype.toISOString()
其它
typeof JSON === 'object'
内置函数 parseInt()
忽略前导零
标识符支持零宽字符
字面量的扩展用法(对象和数组相关)
未保留的词
可枚举属性可以被不可枚举属性 shadowed
语法
函数:默认参数和剩余参数、new.target
解构(destructuring):声明、赋值、参数
展开语法(spread syntax):对可迭代对象
Module
字面量
模板字面量
对象字面量的扩展用法
八进制和二进制
for..of
循环
正则表达式的 y 和 u 标志
Unicode 的代码点(code point)转义
绑定
const
let
块级作用域里的函数声明
内置
内置对象的扩展用法
Object 静态方法
Object.assign()
Object.is()
Object.getOwnPropertySymbols()
Object.setPrototypeOf()
String 的静态方法和实例方法
Array 的静态方法和实例方法
Number
Math
RegExp 的 prototype
属性
函数的 name 属性
Date.prototype[Symbol.toPrimitive]
幂运算符 **
Array.prototype.includes()
async 和 await 关键字:async function
Object 三个静态方法
values()
entries()
getOwnPropertyDescriptors()
String.prototype.
padStart()
padEnd()
SharedArrayBuffer
Atomics
Object 的 ...
操作:rest 和 spread
Promise.prototype.finally()
异步迭代器
async 生成器
for-await-of 循环
RegExp 相关的四个
s
标志
命名捕获组
Lookbehind 断言
Unicode 属性转义
Object.fromEntries()
Symbol.prototype.description
String 的实例方法
trimLeft()
trimRight()
trimStart()
trimEnd()
Array 的实例方法
flat()
flatMap()
运算符 ?.
和 ??
BigInt 类型
String.prototype.matchAll()
globalThis
关键字
import.meta
Dynamic import
Promise.allSettled()
class 私有变量 #
String.prototype.replaceAll()
Promise.any()
WeakRef(不阻止对象的垃圾回收)
逻辑赋值 ||=
, &&=
, ??=
数字分隔符 _
比如 1_0002_2223.1415_9260 === 100022223.1415926
结果是 true
比如 0b1110000111110001 === 0b1110_0001_1111_0001
结果是 true
Object.hasOwn()
索引方法 at()
:支持负数下标
class 相关
instance fields
static fields
private methods
static initialization blocks
Error 的 cause
属性
RegExp 的 d
标识
Array.prototype:从数组的末尾开始遍历
findLast()
findLastIndex()
Array.prototype:通过副本更改数组(非破坏性的)
toReversed()
toSorted()
toSpliced()
with()
Symbol
作为 WeakMap
的 key
词法 #!
:参考 Unix 中的,该命令放在脚本第一行,用来指定脚本的执行器
执行脚本文件,之前 node test.js
,现在 ./test.js
其中 test.js
文件的第一行写 #!/usr/bin/env node