在本文中,我们将回顾ES2020随附的一些最新和最出色的功能。
由于许多人的浏览器版本低,我们需要使用babel来让用户使用无法使用的特性。为了简单起见,我将使用Parcel bundler
使一切尽快运行。
$ yarn add parcel-bundler
"scripts": {
"start": "parcel index.html"
},
不幸的是,现在似乎还没有ES2020的有效预设。 如果将它们放在.babelrc
文件中并保存,Parcel应该会为您安装所有内容
{
"plugins": [
"@babel/plugin-proposal-nullish-coalescing-operator",
"@babel/plugin-proposal-optional-chaining",
"@babel/plugin-proposal-class-properties",
"@babel/plugin-proposal-private-methods",
"@babel/plugin-syntax-bigint"
]
}
类的主要目的之一是将代码包含到更可重用的模块中。因为你将创建一个在许多不同地方使用的类,所以你可能不希望它内部的所有内容都是全局可用的。现在,通过在变量或函数前面添加一个简单的哈希符号,我们可以将它们完全保留为类内部使用
class Message {
#message = "Howdy"
greet() { console.log(this.#message) }
}
const greeting = new Message()
greeting.greet() // Howdy
console.log(greeting.#message) // Private name #message is not defined
当我们处理多个Promise时,特别是当它们相互依赖时,记录每个Promise所发生的事情来调试错误是很有必要的。通过Promise.allSettled
,我们可以创建一个新的Promise,它只在所有传递给它的Promise都完成时返回一个数组,其中包含每个Promise的数据。
const p1 = new Promise((res, rej) => setTimeout(res, 1000));
const p2 = new Promise((res, rej) => setTimeout(rej, 1000));
Promise.allSettled([p1, p2]).then(data => console.log(data));
// [
// Object { status: "fulfilled", value: undefined},
// Object { status: "rejected", reason: undefined}
// ]
由于JavaScript是动态类型的,因此在分配变量时,您需要牢记JavaScript对真实/错误值的处理。 如果我们有一个带有某些值的对象,有时我们希望允许使用从技术上讲是虚假的值,例如空字符串或数字0。设置默认值很快会令人讨厌,因为默认值会覆盖应为有效值的值。
let person = {
profile: {
name: "",
age: 0
}
};
console.log(person.profile.name || "Anonymous"); // Anonymous
console.log(person.profile.age || 18); // 18
我们可以使用??
操作符来代替||
,使其类型更严格一些,这只允许在值为null或未定义时使用默认值。
console.log(person.profile.name ?? "Anonymous"); // ""
console.log(person.profile.age ?? 18); // 0
与合并空操作符类似,JavaScript在处理错误值时可能无法按我们希望的方式工作。如果我们想要的是未定义的,我们可以返回一个值,但是如果到它的路径是未定义的呢?通过在.
之前添加一个问号,我们可以使值的路径的任何部分成为可选的,这样我们仍然可以与它交互。
let person = {};
console.log(person.profile.name ?? "Anonymous"); // person.profile is undefined
console.log(person?.profile?.name ?? "Anonymous");
console.log(person?.profile?.age ?? 18);
JavaScript可以处理的最大数字是2 ^ 53
,我们可以在MAX_SAFE_INTEGER
中看到
const max = Number.MAX_SAFE_INTEGER;
console.log(max); // 9007199254740991
超过这个数字就会变得有点奇怪…
console.log(max + 1); // 9007199254740992
console.log(max + 2); // 9007199254740992
console.log(max + 3); // 9007199254740994
console.log(Math.pow(2, 53) == Math.pow(2, 53) + 1); // true
我们可以使用新的 BigInt
数据类型来解决这个问题。通过把字母n
放在末尾,我们可以与大得离谱的数字进行交互。我们无法将标准数字与BigInt数字混合在一起,因此任何数学运算都需要使用BigInt来完成。
const bigNum = 100000000000000000000000000000n;
console.log(bigNum * 2n); // 200000000000000000000000000000n
如果您有一个写满实用程序功能的文件,而且其中某些功能可能很少使用,那么导入其所有依赖项可能只是浪费资源。 现在,我们可以使用async / await
在需要时动态导入依赖项。
const add = (num1, num2) => num1 + num2;
export { add };
const doMath = async (num1, num2) => {
if (num1 && num2) {
const math = await import('./math.js');
console.log(math.add(5, 10));
};
};
doMath(4, 2);
本文译自 [https://alligator.io/js/es2020/](https://alligator.io/js/es2020/)
在本文中,我们将回顾ES2020随附的一些最新和最出色的功能。
由于许多人的浏览器版本低,我们需要使用babel来让用户使用无法使用的特性。为了简单起见,我将使用Parcel bundler
使一切尽快运行。
$ yarn add parcel-bundler
"scripts": {
"start": "parcel index.html"
},
不幸的是,现在似乎还没有ES2020的有效预设。 如果将它们放在.babelrc
文件中并保存,Parcel应该会为您安装所有内容
{
"plugins": [
"@babel/plugin-proposal-nullish-coalescing-operator",
"@babel/plugin-proposal-optional-chaining",
"@babel/plugin-proposal-class-properties",
"@babel/plugin-proposal-private-methods",
"@babel/plugin-syntax-bigint"
]
}
类的主要目的之一是将代码包含到更可重用的模块中。因为你将创建一个在许多不同地方使用的类,所以你可能不希望它内部的所有内容都是全局可用的。现在,通过在变量或函数前面添加一个简单的哈希符号,我们可以将它们完全保留为类内部使用
class Message {
#message = "Howdy"
greet() { console.log(this.#message) }
}
const greeting = new Message()
greeting.greet() // Howdy
console.log(greeting.#message) // Private name #message is not defined
当我们处理多个Promise时,特别是当它们相互依赖时,记录每个Promise所发生的事情来调试错误是很有必要的。通过Promise.allSettled
,我们可以创建一个新的Promise,它只在所有传递给它的Promise都完成时返回一个数组,其中包含每个Promise的数据。
const p1 = new Promise((res, rej) => setTimeout(res, 1000));
const p2 = new Promise((res, rej) => setTimeout(rej, 1000));
Promise.allSettled([p1, p2]).then(data => console.log(data));
// [
// Object { status: "fulfilled", value: undefined},
// Object { status: "rejected", reason: undefined}
// ]
由于JavaScript是动态类型的,因此在分配变量时,您需要牢记JavaScript对真实/错误值的处理。 如果我们有一个带有某些值的对象,有时我们希望允许使用从技术上讲是虚假的值,例如空字符串或数字0。设置默认值很快会令人讨厌,因为默认值会覆盖应为有效值的值。
let person = {
profile: {
name: "",
age: 0
}
};
console.log(person.profile.name || "Anonymous"); // Anonymous
console.log(person.profile.age || 18); // 18
我们可以使用??
操作符来代替||
,使其类型更严格一些,这只允许在值为null或未定义时使用默认值。
console.log(person.profile.name ?? "Anonymous"); // ""
console.log(person.profile.age ?? 18); // 0
与合并空操作符类似,JavaScript在处理错误值时可能无法按我们希望的方式工作。如果我们想要的是未定义的,我们可以返回一个值,但是如果到它的路径是未定义的呢?通过在.
之前添加一个问号,我们可以使值的路径的任何部分成为可选的,这样我们仍然可以与它交互。
let person = {};
console.log(person.profile.name ?? "Anonymous"); // person.profile is undefined
console.log(person?.profile?.name ?? "Anonymous");
console.log(person?.profile?.age ?? 18);
JavaScript可以处理的最大数字是2 ^ 53
,我们可以在MAX_SAFE_INTEGER
中看到
const max = Number.MAX_SAFE_INTEGER;
console.log(max); // 9007199254740991
超过这个数字就会变得有点奇怪…
console.log(max + 1); // 9007199254740992
console.log(max + 2); // 9007199254740992
console.log(max + 3); // 9007199254740994
console.log(Math.pow(2, 53) == Math.pow(2, 53) + 1); // true
我们可以使用新的 BigInt
数据类型来解决这个问题。通过把字母n
放在末尾,我们可以与大得离谱的数字进行交互。我们无法将标准数字与BigInt数字混合在一起,因此任何数学运算都需要使用BigInt来完成。
const bigNum = 100000000000000000000000000000n;
console.log(bigNum * 2n); // 200000000000000000000000000000n
如果您有一个写满实用程序功能的文件,而且其中某些功能可能很少使用,那么导入其所有依赖项可能只是浪费资源。 现在,我们可以使用async / await
在需要时动态导入依赖项。
const add = (num1, num2) => num1 + num2;
export { add };
const doMath = async (num1, num2) => {
if (num1 && num2) {
const math = await import('./math.js');
console.log(math.add(5, 10));
};
};
doMath(4, 2);
本文译自 [https://alligator.io/js/es2020/](https://alligator.io/js/es2020/)