ES6 (ECMAScript 2015)
1. let 和 const
- let 允许声明一个块作用域的变量。
- const 允许声明一个块作用域的常量。
let x = 10;
if (x === 10) {
let x = 20;
console.log(x);
}
console.log(x);
const y = 5;
2. 模板字符串
- 允许字符串内嵌表达式,可以用反引号 (``) 来定义。
let name = "world";
console.log(`Hello, ${name}!`);
3.箭头函数
let add = (a, b) => a + b;
console.log(add(2, 3));
4.解构赋值
- 允许用类似数组或对象字面量的语法来分配值到变量中。
let [a, b] = [1, 2];
console.log(a);
console.log(b);
let {firstName, lastName} = {firstName: "John", lastName: "Doe"};
console.log(firstName);
console.log(lastName);
5.Promise
- 提供了一种更好的异步编程解决方案,比传统的回调函数方式更易于理解和维护。
let promise = new Promise(function(resolve, reject) {
setTimeout(() => resolve("done"), 1000);
});
promise.then(
result => console.log(result),
error => console.log(error)
);
ES7 (ECMAScript 2016)
1.数组的 includes 方法
let arr = [1, 2, 3];
console.log(arr.includes(2));
console.log(arr.includes(4));
2.指数运算符
console.log(2 ** 3);
ES8 (ECMAScript 2017)
1.async/await
async function asyncCall() {
console.log('calling');
let result = await new Promise((resolve) => {
setTimeout(() => resolve("resolved"), 1000)
});
console.log(result);
}
asyncCall();
2.Object.values()
- 该方法返回一个给定对象自身的所有可枚举属性值的数组,不包括原型链上的属性。
const object = { a: 1, b: '2', c: true };
console.log(Object.values(object));
3.Object.entries()
- 与Object.values()类似,Object.entries()返回一个给定对象自身的所有可枚举属性[key,
value]对的数组。
const object = { a: 1, b: '2', c: true };
console.log(Object.entries(object));
4.String Padding
- 两个实用的字符串实例方法:padStart()和padEnd()允许以一种便捷的方式给字符串前后填充字词,直到达到目标长度。
padStart()
let str = "5";
console.log(str.padStart(2, "0"));
padEnd()
let str = "5";
console.log(str.padEnd(2, "0"));
5.Object.getOwnPropertyDescriptors();
- 此方法用于获取一个对象的所有自身属性的描述符。若没有任何自身属性,则返回空对象。
const obj = {
property1: 42
};
const descriptors = Object.getOwnPropertyDescriptors(obj);
console.log(descriptors.property1.writable);
console.log(descriptors.property1.value);
6.尾部逗号 (Trailing commas) 在函数参数列表和调用中
- ES8 允许在函数参数定义和调用时使用尾部逗号,这有助于版本控制系统中清晰地查看实际更改的参数,避免因格式更改引起的不必要的差异。
function myFunc(
param1,
param2,
) {
}
myFunc(
1,
2,
);
ES9 (ECMAScript 2018)
1. 异步迭代(for-await-of)
- 允许使用 for…of 循环迭代异步操作,特别是对异步生成的集合。
async function* asyncGenerator() {
let i = 0;
while (i < 3) {
await new Promise(resolve => setTimeout(resolve, 100));
yield i++;
}
}
(async () => {
for await (let num of asyncGenerator()) {
console.log(num);
}
})();
2.Promise.prototype.finally()
- 可以指定一个在promise执行之后无论是fulfilled还是rejected都会执行的回调函数。
new Promise((resolve, reject) => {
setTimeout(() => resolve("Success"), 1000);
})
.then(result => console.log(result))
.catch(error => console.error(error))
.finally(() => console.log("Promise is settled."));
3.Rest/Spread 属性
- 对象现在也支持 rest 参数和 spread 属性。
let { x, y, ...z } = { x: 1, y: 2, a: 3, b: 4 };
console.log(x);
console.log(y);
console.log(z);
let n = { x, y, ...z };
console.log(n);
ES10 (ECMAScript 2019)
1.Array.prototype.flat() 和 Array.prototype.flatMap()
let arr = [1, [2, [3, [4]]]];
console.log(arr.flat());
console.log(arr.flat(2));
console.log(arr.flat(Infinity));
2.String.prototype.trimStart() 和 String.prototype.trimEnd()
let greeting = ' Hello world! ';
console.log(greeting.trimStart());
console.log(greeting.trimEnd());
3.Object.fromEntries()
let entries = [['name', 'John'], ['age', 30]];
let obj = Object.fromEntries(entries);
console.log(obj);
ES11 (ECMAScript 2020)
1.BigInt 类型
let bigInt = 1234567890123456789012345678901234567890n;
console.log(bigInt + 1n);
2.动态导入(import())
(async () => {
if (condition) {
const module = await import('./module.js');
module.doSomething();
}
})();
3.Promise.allSettled()
- 返回一个在所有给定的promise已经fulfilled或rejected后的promise,并带有每个promise的结果。
let promises = [
Promise.resolve(33),
new Promise(resolve => setTimeout(() => resolve(66), 0)),
Promise.reject(new Error('an error'))
];
Promise.allSettled(promises)
.then(results => results.forEach((result) => console.log(result.status)));
ES12 (ECMAScript 2021)
1.String.prototype.replaceAll()
let quote = 'To be or not to be';
console.log(quote.replaceAll('be', 'test'));
2.逻辑赋值运算符
- 包含逻辑与 (&&=), 逻辑或 (||=) 和逻辑空值 (??=) 赋值运算符。
let x = 0;
let y = 1;
x &&= 2;
console.log(x);
y ||= 2;
console.log(y);
let z = null;
z ??= 2;
console.log(z);