发现宝藏
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【宝藏入口】。
ES6(也称为 ECMAScript 2015)到 ES10(也称为 ECMAScript 2019)期间,JavaScript 引入了许多重要的特性和改进。以下是从 ES6 到 ES10 每个版本新增的关键功能:
ES6 (ECMAScript 2015)
ES6 是 JavaScript 的一个重大版本,引入了许多新的语言特性,增强了语言的表达能力和可维护性。
-
let
和const
新的变量声明方式,用于替代var
。let
:用于声明块级作用域的变量。const
:用于声明常量,值不可更改。
let a = 10; const b = 20;
-
箭头函数 (Arrow Functions)
语法简洁的函数表达式,且绑定this
的方式不同。const add = (x, y) => x + y;
-
模板字符串 (Template Literals)
支持多行字符串和插入变量的字符串。const name = 'John'; const greeting = `Hello, ${name}!`;
-
类 (Classes)
引入面向对象的类语法,提供了继承、构造函数等特性。class Person { constructor(name) { this.name = name; } }
-
模块化 (Modules)
支持import
和export
来导入和导出模块。// module.js export const pi = 3.14; // app.js import { pi } from './module';
-
解构赋值 (Destructuring Assignment)
允许从数组或对象中提取值,并将其赋给变量。const [x, y] = [1, 2]; const { name, age } = { name: 'John', age: 30 };
-
增强的对象字面量 (Enhanced Object Literals)
对象字面量可以使用简洁的语法来定义方法和属性。const name = 'John'; const person = { name, greet() { console.log('Hello'); } };
-
Promise
引入了Promise
来处理异步操作,使得回调地狱问题得到缓解。const fetchData = () => new Promise(resolve => resolve('Data'));
-
Symbol
新的原始数据类型,用于创建匿名的唯一值,主要用于对象属性的键。const sym = Symbol('description');
-
迭代器和生成器 (Iterators & Generators)
- 迭代器:提供一种访问集合元素的机制。
- 生成器:通过
function*
声明的函数,可以暂停和恢复执行。
function* gen() { yield 1; yield 2; }
ES7 (ECMAScript 2016)
-
Array.prototype.includes()
用于判断数组中是否包含某个元素,替代indexOf()
。const arr = [1, 2, 3]; console.log(arr.includes(2)); // true
-
指数操作符 (
**
)
引入了指数运算符,用于幂运算。console.log(2 ** 3); // 8
ES8 (ECMAScript 2017)
-
async
和await
用于简化异步代码,使得Promise
更易于理解和使用。async function fetchData() { const data = await fetch('https://api.example.com'); return data.json(); }
-
Object.values()
和Object.entries()
Object.values()
:返回对象的所有值。Object.entries()
:返回对象的所有键值对数组。
const obj = { a: 1, b: 2 }; console.log(Object.values(obj)); // [1, 2] console.log(Object.entries(obj)); // [['a', 1], ['b', 2]]
-
String.padStart()
和String.padEnd()
用于填充字符串,使其达到指定的长度。'5'.padStart(3, '0'); // '005' '5'.padEnd(3, '0'); // '500'
-
共享内存和原子操作 (Shared Memory and Atomics)
用于多线程编程,适合 Web Workers 使用。
ES9 (ECMAScript 2018)
-
异步迭代器 (Async Iterators)
异步迭代器和for-await-of
循环使得可以异步遍历集合。async function* asyncGenerator() { yield 1; yield 2; } for await (let val of asyncGenerator()) { console.log(val); // 1, 2 }
-
Object Rest/Spread Properties
允许从对象中提取剩余属性,或者将属性展开到新的对象中。const { a, ...rest } = { a: 1, b: 2, c: 3 }; console.log(rest); // { b: 2, c: 3 } const newObj = { ...rest, d: 4 }; console.log(newObj); // { b: 2, c: 3, d: 4 }
-
Promise.prototype.finally()
finally()
方法允许你为Promise
链接添加清理代码,不论Promise
是成功还是失败。fetchData().finally(() => console.log('Done'));
ES10 (ECMAScript 2019)
-
Array.prototype.flat()
和Array.prototype.flatMap()
flat()
方法可以将嵌套的数组展开为一个新数组;flatMap()
是对每个元素进行映射后再展平。const arr = [1, [2, 3], [4, 5]]; console.log(arr.flat()); // [1, 2, 3, 4, 5] const arr2 = [1, 2, 3]; console.log(arr2.flatMap(x => [x, x * 2])); // [1, 2, 2, 4, 3, 6]
-
Object.fromEntries()
将一个键值对列表转换为对象,通常与Object.entries()
配合使用。const entries = [['a', 1], ['b', 2]]; const obj = Object.fromEntries(entries); console.log(obj); // { a: 1, b: 2 }
-
String.prototype.trimStart()
和String.prototype.trimEnd()
用于去除字符串两端的空白字符。const str = ' Hello '; console.log(str.trimStart()); // 'Hello ' console.log(str.trimEnd()); // ' Hello'
-
Array.prototype.sort()
的稳定性
ES10 标准确保Array.prototype.sort()
方法是稳定的,这意味着相等的元素在排序后会保持原来的相对位置。 -
Symbol.prototype.description
通过description
属性可以获取Symbol
的描述信息。const sym = Symbol('foo'); console.log(sym.description); // 'foo'
总结
从 ES6 到 ES10,JavaScript 引入了许多提升代码可读性、简洁性以及处理复杂异步操作的特性。以下是这些版本的主要特性:
- ES6: 引入了
let
、const
、箭头函数、模块化、Promise、类、模板字符串等。 - ES7: 引入了
Array.prototype.includes()
和指数运算符**
。 - ES8: 引入了
async/await
、Object.values()
、Object.entries()
、String.padStart()
和String.padEnd()
。 - ES9: 引入了异步迭代器、
Object rest/spread
、Promise.prototype.finally()
。 - ES10: 引入了
Array.prototype.flat()
、Object.fromEntries()
、String.prototype.trimStart()
和String.prototype.trimEnd()
。
这些新特性极大地改善了 JavaScript 的语法,增强了开发效率。