ECMAScript 1:
- 发布时间:1997年6月
- 更新内容:第一个ECMAScript标准,包括基本语法、数据类型、控制流和基本对象。
ECMAScript 2:
- 发布时间:1998年6月
- 更新内容:修正了第一个标准中的一些缺陷。
ECMAScript 3:
-
发布时间:1999年12月
-
更新内容:对语言进行了重大升级,增加了正则表达式、错误处理和更强大的面向对象编程支持。
-
示例:
- 正则表达式:
var pattern = /hello\s+(world|everyone)/; var result = pattern.exec("hello world"); console.log(result[1]); // "world"
- 错误处理:
try { // some code that might throw an error } catch (e) { console.error("An error occurred:", e.message); }
- 面向对象编程:
function Person(name, age) { this.name = name; this.age = age; } Person.prototype.sayHello = function() { console.log("Hello, my name is " + this.name); }; var john = new Person("John", 30); john.sayHello(); // "Hello, my name is John"
ECMAScript 4:
- 发布时间:未发布
- 更新内容:该版本规范被废弃,没有正式发布。
ECMAScript 5:
-
发布时间:2009年12月
-
更新内容:引入了一些新特性,如严格模式、JSON对象、Object.getPrototypeOf()和Object.keys()等。
-
示例:
- 严格模式:
"use strict"; // some strict code here
- JSON对象:
var jsonStr = '{"name": "John", "age": 30}'; var obj = JSON.parse(jsonStr); console.log(obj.name); // "John"
- Object.getPrototypeOf():
var obj = {}; var proto = Object.getPrototypeOf(obj); console.log(proto === Object.prototype); // true
- Object.keys():
var obj = {name: "John", age: 30}; var keys = Object.keys(obj); console.log(keys); // ["name", "age"]
-
严格模式:添加了严格模式来更加规范地编写JavaScript代码。
-
函数的bind方法:允许指定函数中的this关键字绑定到指定的对象上。
-
Array的方法:添加了一些Array对象的新方法,如map、filter、reduce等。
-
JSON对象:将JSON对象纳入ECMAScript规范,并规定了JSON格式的字符串格式。
ECMAScript 5.1:
- 发布时间:2011年6月
- 更新内容:修复了ECMAScript 5中的一些错误。
下面是一些ECMAScript 5.1的示例:
// 严格模式示例
"use strict";
function strictFunc() {
// 在严格模式下,使用未声明的变量会报错
undeclaredVar = 10;
}
strictFunc();
// bind方法示例
var person = {
firstName: "John",
lastName: "Doe"
};
function greeting() {
console.log("Hello, " + this.firstName + " " + this.lastName);
}
var greetPerson = greeting.bind(person);
greetPerson();
// Array方法示例
var numbers = [1, 2, 3, 4, 5];
var doubledNumbers = numbers.map(function(num) {
return num * 2;
});
console.log(doubledNumbers); // [2, 4, 6, 8, 10]
// JSON示例
var person = {
firstName: "John",
lastName: "Doe",
age: 30
};
var jsonString = JSON.stringify(person);
console.log(jsonString); // {"firstName":"John","lastName":"Doe","age":30}
ECMAScript 6:
- 发布时间:2015年6月
- 更新内容:引入了许多重要的新特性,如箭头函数、模板字符串、解构赋值、类和模块等。
ECMAScript 6(ES6)是JavaScript语言的下一代标准,也称为ECMAScript 2015。它于2015年6月发布,引入了许多新的语言特性和语法改进。下面是ECMAScript 6的一些重要特性和示例:
- let 和 const 声明(2015年6月发布):
- let 和 const 声明取代了 var 声明。
- let 声明用于声明局部变量,const 声明用于声明常量。
- 示例:
let x = 1; // 局部变量
const PI = 3.14; // 常量
- 箭头函数(2015年6月发布):
- 箭头函数是一种更简短的函数语法。
- 它们使用 => 符号来分隔参数和函数体。
- 示例:
// 传统函数
function add(x, y) {
return x + y;
}
// 箭头函数
let add = (x, y) => x + y;
- 模板字面量(2015年6月发布):
- 模板字面量允许在字符串中插入变量。
- 使用反引号(`)而不是引号。
- 示例:
let name = 'John';
console.log(`Hello, ${name}!`);
- 解构赋值(2015年6月发布):
- 解构赋值允许从数组或对象中提取值并赋给变量。
- 示例:
// 数组解构赋值
let [x, y] = [1, 2];
// 对象解构赋值
let { name, age } = { name: 'John', age: 30 };
- 类和继承(2015年6月发布):
- 类是一种声明对象的结构。
- 继承允许类从其他类继承属性和方法。
- 示例:
class Person {
constructor(name, age) {
this.name = name;
this.age = age;
}
sayHello() {
console.log(`Hello, my name is ${this.name} and I am ${this.age} years old.`);
}
}
class Student extends Person {
constructor(name, age, grade) {
super(name, age);
this.grade = grade;
}
study() {
console.log(`${this.name} is studying hard!`);
}
}
let john = new Student('John', 18, '12th');
john.sayHello(); // 输出:Hello, my name is John and I am 18 years old.
john.study(); // 输出:John is studying hard!
- Promise(2015年6月发布):
- Promise 是一种处理异步操作的方法。
- 它们可以让您在操作完成后执行其他代码。
- 示例:
let promise = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('Success!');
}, 1000);
});
promise.then((result) => {
console.log(result); // 输出:Success!
})
ECMAScript 2017 (ES8)
时间:2017年6月
更新内容:
- Object.entries() 和 Object.values()
新增了Object.entries()和Object.values()两个静态方法,可以分别返回对象的键值对和值的集合。
示例:
const obj = { foo: 'bar', baz: 42 };
console.log(Object.entries(obj)); // [['foo', 'bar'], ['baz', 42]]
console.log(Object.values(obj)); // ['bar', 42]
- 字符串填充方法 padStart() 和 padEnd()
新增了字符串填充方法padStart()和padEnd(),可以在字符串的开头或结尾添加指定的字符,使字符串达到指定的长度。
示例:
const str = 'foo';
console.log(str.padStart(6, 'x')); // 'xxxxfo'
console.log(str.padEnd(6, 'x')); // 'fooxxx'
- 函数参数列表结尾允许逗号
在函数参数列表中,最后一个参数后允许有一个逗号,这样有助于在添加或删除参数时保持代码的一致性。
示例:
function myFunction(a, b, c,) {
// ...
}
- 共享内存和原子操作API
新增了共享内存和原子操作的API,这些API支持多线程JavaScript应用程序的开发。
示例:
const buffer = new SharedArrayBuffer(16);
const view = new Int32Array(buffer);
function updateView() {
Atomics.store(view, 0, 123);
}
function getView() {
return Atomics.load(view, 0);
}
ECMAScript 2018 (ES9)
时间:2018年6月
更新内容:
- 异步迭代
新增了异步迭代器和for-await-of循环,可以更方便地遍历异步数据流。
示例:
async function* asyncGenerator() {
yield 1;
yield 2;
yield 3;
}
(async function() {
for await (let num of asyncGenerator()) {
console.log(num);
}
})();
- Promise.prototype.finally()
新增了Promise.prototype.finally()方法,用于指定在Promise状态变为resolved或rejected时都会执行的回调函数。
示例:
function myFetch() {
return fetch('https://example.com/data')
.then(response => response.json())
.finally(() => {
console.log('cleanup');
});
}
- Rest/Spread属性
Rest/Spread属性支持了对象和数组的展开操作符(...),用于方便地复制和合并数据。
示例:
const obj1 = { a: 1, b: 2 };
const obj2 = { ...obj1, c: 3 };
const arr1 = [1, 2, 3];
const arr2 = [4, 5, 6];
const arr3 = [...arr1, ...arr2];
ECMAScript 2019 (ES10)
时间:2019年6月
更新内容:
- Object.fromEntries():该方法可以将键值对列表转换为对象。这在将Map转换为对象时非常有用。
示例:
const entries = new Map([['foo', 'bar'], ['baz', 42]]);
const obj = Object.fromEntries(entries);
console.log(obj); // {foo: "bar", baz: 42}
- String.trimStart()和String.trimEnd():这两个方法可以分别用于删除字符串的开头和结尾的空白字符。
示例:
const str = " hello world ";
console.log(str.trimStart()); // "hello world "
console.log(str.trimEnd()); // " hello world"
- Array.prototype.flat()和Array.prototype.flatMap():这两个方法可以用于将嵌套数组“展平”。
示例:
const arr = [1, 2, [3, 4, [5, 6]]];
console.log(arr.flat()); // [1, 2, 3, 4, [5, 6]]
console.log(arr.flat(2)); // [1, 2, 3, 4, 5, 6]
const arr2 = [1, 2, 3];
console.log(arr2.flatMap(x => [x * 2])); // [2, 4, 6]
- Optional Catch Binding:现在可以省略catch语句中的参数,例如:
示例:
try {
// code here
} catch {
// handle error here
}
- Object.getOwnPropertyDescriptors():该方法返回对象的所有属性描述符,包括它们的值、可枚举性、可配置性和可写性等信息。
示例:
const obj = { foo: 'bar' };
console.log(Object.getOwnPropertyDescriptors(obj));
// { foo: { value: 'bar', writable: true, enumerable: true, configurable: true } }
- BigInt:现在可以使用BigInt类型来表示更大的整数。
示例:
const x = 9007199254740991n;
const y = 9007199254740992n;
console.log(x + y); // 18014398509481983n
- 其他改进:还有一些其他的改进,例如,Array.prototype.sort()方法现在使用TimSort算法,以及Function.prototype.toString()方法现在返回完整的函数源代码等等。
ECMAScript 2020 (ES11)
时间:2020年6月
ECMAScript 2020是JavaScript语言的最新版本,也称为ES11或ES2020。它在2020年6月发布,包含了一些新特性和改进,下面是一些重要的更新:
- Promise.allSettled()方法:Promise.allSettled()方法返回一个Promise,该Promise会在所有传递的Promise已完成后完成,而不管它们是否成功。
示例:
const promises = [
Promise.resolve('resolved'),
Promise.reject('rejected'),
Promise.resolve('resolved again')
];
Promise.allSettled(promises)
.then(results => console.log(results));
输出结果:
[
{status: "fulfilled", value: "resolved"},
{status: "rejected", reason: "rejected"},
{status: "fulfilled", value: "resolved again"}
]
- 可选链操作符(Optional chaining operator):可选链操作符允许您在不验证前面每个引用是否存在的情况下安全地访问深层嵌套的对象。
示例:
const user = {
name: 'John',
address: {
street: '123 Main St',
city: 'Anytown',
state: 'CA',
zip: '12345'
}
};
console.log(user?.address?.street); // 123 Main St
console.log(user?.phone?.number); // undefined
-
空值合并运算符(Nullish coalescing operator):空值合并运算符(??)是一种用于处理null或undefined值的新运算符。如果左侧的操作数为null或undefined,则返回右侧的操作数,否则返回左侧
-
的操作数。
示例:
const someValue = null; const anotherValue = 'Hello'; console.log(someValue ?? 'Default Value'); // Default Value console.log(anotherValue ?? 'Default Value'); // Hello
- 可迭代对象的新方法:该版本中还引入了一些新的可迭代对象方法,如BigInt、String、Array等对象的新方法。
示例:
// BigInt新方法 const bigNum = 123456789n; console.log(bigNum.toLocaleString('en-US')); // 123,456,789 // String新方法 const str = 'Hello World'; console.log(str.startsWith('Hello')); // true console.log(str.endsWith('World')); // true console.log(str.trimEnd()); // 'Hello World' // Array新方法 const arr = [1, 2, 3]; console.log(arr.copyWithin(1, 0)); // [1, 1, 2] console.log(arr.flat()); // [1, 1, 2]
ECMAScript 2021(ES12)
时间:2021年6月
ECMAScript 2021是JavaScript语言的最新版本,也称为ES12或ES2021。它在2021年6月发布,包含了一些新特性和改进,下面是一些重要的更新:
- Promise.any()方法:Promise.any()方法接收一个由多个Promise对象组成的数组,返回最快解决的Promise的结果。
示例:
const promises = [
new Promise((resolve) => setTimeout(resolve, 5000, 'first')),
new Promise((resolve) => setTimeout(resolve, 2000, 'second')),
new Promise((resolve, reject) => setTimeout(reject, 3000, 'rejected'))
];
Promise.any(promises)
.then(result => console.log(result)); // 'second'
- WeakRefs:WeakRefs是一种新的垃圾回收机制,可以在不影响内存管理的情况下,将对象存储在弱引用中。
示例:
let obj = {a: 1};
const weakRef = new WeakRef(obj);
obj = null;
setTimeout(() => {
if (weakRef.deref() === undefined) {
console.log('Object is garbage collected');
}
}, 5000);
- 数值分隔符(Numeric separators):数值分隔符允许在数字字面量中使用下划线来分隔数字,以提高代码的可读性。
示例:
const bigNumber = 1_000_000_000;
const binaryNumber = 0b1010_0001;
const hexNumber = 0xFF_00_FF;
- String.prototype.replaceAll()方法:String.prototype.replaceAll()方法可以替换字符串中所有出现的子字符串。
示例:
const str = 'Hello World';
console.log(str.replaceAll('l', 'X')); // 'HeXXo WorXd'
这些是ECMAScript 2021的一些重要更新和示例。这个版本中还有其他的改进和更新,可以在官方文档中了解到更多信息。