JavaScript - ECMAScript 2019:初学者指南

你好,未来的编程巨星们!我很高兴能成为你们在这激动人心的ECMAScript 2019世界之旅中的向导。作为一个教编程多年的前辈,我迫不及待地想和你们分享这门语言的奇妙之处。那么,拿起你们的虚拟笔记本,让我们一起深入探索吧!

ECMAScript 2019

ECMAScript 2019简介

在我们开始之前,先来快速了解一下ECMAScript是什么。想象JavaScript是一块美味的蛋糕,而ECMAScript则是制作它的食谱。每年,这个食谱都会进行微调和改进,2019年也不例外。ECMAScript 2019为我们带来了一些新特性,使得我们的JavaScript蛋糕更加美味!

ECMAScript 2019新增特性

ECMAScript 2019引入了一些令人兴奋的新特性,让我们的编码生活变得更轻松。我们一起来一一探索,好吗?

JavaScript Array flat() 方法

你是否曾经有一个里面装着盒子的乱糟糟的房间?JavaScript中的嵌套数组有点就像那样。flat()方法就像一个神奇的清洁机器人,打开所有这些盒子,并把所有东西放在一个整洁的层面上。

让我们看看它是如何工作的:

const messyRoom = [1, 2, [3, 4, [5, 6]]];
const tidyRoom = messyRoom.flat(2);
console.log(tidyRoom); // 输出: [1, 2, 3, 4, 5, 6]

在这个例子中,messyRoom是我们的嵌套数组。flat(2)方法深入两层来展平数组。结果是tidyRoom,其中所有的数字都在同一层级上。很酷吧?

JavaScript Array flatMap()

现在,想象一下如果我们的清洁机器人不仅能整理,还能在整理过程中转换物品。这就是flatMap()所做的!它就像map()flat()生下的一个超能力婴儿。

这是一个有趣的例子:

const pets = ["dog", "cat", "fish"];
const petSounds = pets.flatMap(pet => {
if (pet === "dog") return ["woof", "bark"];
if (pet === "cat") return ["meow"];
return [];
});
console.log(petSounds); // 输出: ["woof", "bark", "meow"]

在这段代码中,我们取pets数组并创建一个包含它们声音的新数组。注意,狗有两个声音,但它们最终都在同一个扁平数组中。不过,鱼太安静了,所以它们没有出现在列表中!

修订版的 Array sort()

sort()方法在ECMAScript 2019中得到了一点改进。现在它保证了数组将以稳定的方式排序。这意味着什么呢?如果一个排序函数认为两个项相等,它们将保持它们相对于彼此的原始顺序。

让我们来看一个例子:

const students = [
{name: "Alice", grade: "B"},
{name: "Bob", grade: "A"},
{name: "Charlie", grade: "B"},
{name: "David", grade: "A"}
];

students.sort((a, b) => a.grade.localeCompare(b.grade));
console.log(students);
/* 输出:
[
{name: "Bob", grade: "A"},
{name: "David", grade: "A"},
{name: "Alice", grade: "B"},
{name: "Charlie", grade: "B"}
]
*/

在这个例子中,我们按学生的成绩排序。注意Bob和David(都是A成绩)保持了他们的原始顺序,Alice和Charlie(都是B成绩)也是一样。这种稳定的排序在许多应用程序中可能非常关键!

JavaScript Object fromEntries

你是否曾经希望你能把一堆键值对变成一个对象?现在你可以用Object.fromEntries()做到了!这就像魔法,但更好,因为它是JavaScript。

来看看这个:

const entries = [
['name', 'Alice'],
['age', 25],
['city', '奇境']
];

const person = Object.fromEntries(entries);
console.log(person);
// 输出: { name: 'Alice', age: 25, city: '奇境' }

在这个例子中,我们从一个键值对数组开始。Object.fromEntries()将这个数组转换成一个对象,其中每对都变成了一个属性。这是Object.entries()的反操作,我们已经有一段时间了。

可选的 catch 绑定

错误处理现在变得更加平滑,因为可选的catch绑定出现了。以前,我们总是在catch子句中指定一个错误参数,即使我们不需要它。现在,如果我们不需要它,可以省略它。

看看它是如何工作的:

// ECMAScript 2019之前
try {
// 可能抛出错误的代码
} catch (error) {
console.log("发生了错误");
}

// ECMAScript 2019中
try {
// 可能抛出错误的代码
} catch {
console.log("发生了错误");
}

看到我们在第二个例子中移除了(error)部分了吗?这就是可选的catch绑定在起作用。这是一个小变化,但当我们不需要使用错误对象时,它可以使得我们的代码更干净。

修订版的 JSON.stringify()

JSON.stringify()在ECMAScript 2019中变得更加智能。它现在能更好地处理一些Unicode字符,确保我们的JSON保持有效。

这里是一个例子:

const obj = { name: "Pikachu\uD800" };
console.log(JSON.stringify(obj));
// 输出: {"name":"Pikachu�"}

在这个例子中,\uD800是一个未配对的代理,可能会在一些JSON分析器中导致问题。新的JSON.stringify()将其替换为Unicode替换字符(�)以保持JSON有效。

修订版的 Function toString()

函数的toString()方法现在返回函数的确切源代码,包括任何空格和注释。这就像得到了你的函数的一个完美的复印件!

让我们看看它是如何工作的:

function greet(name) {
// 这是一个问候函数
console.log(`Hello, ${name}!`);
}

console.log(greet.toString());
/* 输出:
function greet(name) {
// 这是一个问候函数
console.log(`Hello, ${name}!`);
}
*/

正如你所看到的,输出包括了注释并保留了原始格式。这对于调试或生成文档非常有帮助!

字面量中允许使用分隔符符号

ECMAScript 2019带来了一个小但有用的变化:你现在可以在字符串字面量中使用U+2028(行分隔符)和U+2029(段落分隔符)而不需要转义它们。

这里是一个例子:

const text = "Line 1 separator→\u2028←Line 2";
console.log(text);
// 输出:
// Line 1
// Line 2

这个变化使得处理可能包含这些分隔符的文本变得更加容易,尤其是在处理来自其他来源的数据时。

JavaScript String trimStart() 和 trimEnd()

最后但并非最不重要的是,我们得到了两个新的字符串方法:trimStart()trimEnd()。它们就像trim(),但只从字符串的一端移除空格。

让我们看看它们是如何工作的:

const messy = "   Hello, World!   ";
console.log(messy.trimStart()); // 输出: "Hello, World!   "
console.log(messy.trimEnd());   // 输出: "   Hello, World!"
console.log(messy.trim());      // 输出: "Hello, World!"

这些方法在你只想清理字符串的一边时非常棒。它们是旧的trimLeft()trimRight()方法的别名,但名称更清楚地描述了它们的作用。

结论

就这样,伙计们!我们一起穿越了ECMAScript 2019的激动人心的新特性。从展平数组到整理字符串,这些新增功能使得我们的JavaScript更加强大且易于使用。

记住,最好的学习方式是通过实践。所以,去尝试在你的代码中使用这些新特性吧。不要害怕犯错——这就是我们学习和成长的方式。

快乐编码,愿你的JavaScript冒险中没有错误,充满乐趣!

Credits: Image by storyset