10 New JavaScript Features in ES2020 That You Should Know
文章图片
Good news – the new ES2020 features are now finalised! This means we now have a complete idea of the changes happening in ES2020, the new and improved specification of JavaScript. So let's see what those changes are.
原文地址:https://www.freecodecamp.org/...
TC39 stage 4:https://github.com/tc39/propo...
代码运行结果:https://observablehq.com/@spe...
1: BigInt
详细:官方介绍
BigInt, one of the most anticipated features in JavaScript, is finally here. It actually allows developers to have much greater integer representation in their JS code for data processing for data handling.
At the moment the maximum number you can store as an integer in JavaScript is pow(2, 53) - 1
. But BigInt actually allows you to go even beyond that.
Syntax:
A BigInt
is created by appending n
to the end of the integer or by calling the constructor.
const theBiggestInt = 9007199254740991n;
const alsoHuge = BigInt(9007199254740991);
// ? 9007199254740991nconst hugeButString = BigInt('9007199254740991');
// ? 9007199254740991n
文章图片
However, you need to have an
n
appended at the very end of the number, as you can see above. Thisn
denotes that this is a BigInt and should be treated differently by the JavaScript engine (by the v8 engine or whatever engine it is using).This improvement is not backwards compatible because the traditional number system is IEEE754 (which just cannot support numbers of this size).
Operators:
You can use
+
, *
, -
, **
and %
with BigInt
s, just like withNumber
s.const previousMaxSafe = BigInt(Number.MAX_SAFE_INTEGER);
// ? 9007199254740991const maxPlusOne = previousMaxSafe + 1n;
// ? 9007199254740992n
const theFuture = previousMaxSafe + 2n;
// ? 9007199254740993n, this works now!const multi = previousMaxSafe * 2n;
// ? 18014398509481982nconst subtr = multi – 10n;
// ? 18014398509481972nconst mod = multi % 10n;
// ? 2nconst bigN = 2n ** 54n;
// ? 18014398509481984nbigN * -1n
// ? –18014398509481984nconst expected = 4n / 2n;
// ? 2nconst rounded = 5n / 2n;
// ? 2n, not 2.5n
2: Dynamic import Dynamic imports in JavaScript give you the option to import JS files dynamically as modules in your application natively. This is just like how you do it with Webpack and Babel at the moment.
This feature will help you ship on-demand-request code, better known as code splitting, without the overhead of webpack or other module bundlers. You can also conditionally load code in an if-else block if you like.
【10 New JavaScript Features in ES2020 That You Should Know】The good thing is that you actually import a module, and so it never pollutes the global namespace.
文章图片
3: Nullish Coalescing 详细:官方介绍
Nullish coalescing adds the ability to truly check
nullish
values instead of falsey
values. What is the difference between nullish
and falsey
values, you might ask?In JavaScript, a lot of values are
falsey
, like empty strings, the number 0,undefined
,null
,false
,NaN
, and so on.However, a lot of times you might want to check if a variable is nullish – that is if it is either
undefined
or null
, like when it's okay for a variable to have an empty string, or even a false value.In that case, you'll use the new nullish coalescing operator
??
.Syntax:
_Base case_. If the expression at the left-hand side of the
??
operator evaluates to undefined or null, its right-hand side is returned.文章图片
You can clearly see how the OR operator always returns a truthy value, whereas the nullish operator returns a non-nulllish value.
4: Optional Chaining 详细:官方介绍
Optional chaining syntax allows you to access deeply nested object properties without worrying if the property exists or not. If it exists, great! If not,
undefined
will be returned.This not only works on object properties, but also on function calls and arrays. Super convenient! Here's an example:
文章图片
Base case:
a?.b// undefined if `a` is null/undefined, `a.b` otherwise.
a == null ? undefined : a.ba?.[x]// undefined if `a` is null/undefined, `a[x]` otherwise.
a == null ? undefined : a[x]a?.b()// undefined if `a` is null/undefined
a == null ? undefined : a.b() // throws a TypeError if `a.b` is not a function
// otherwise, evaluates to `a.b()`a?.()// undefined if `a` is null/undefined
a == null ? undefined : a()// throws a TypeError if `a` is neither null/undefined, nor a function
// invokes the function `a` otherwise
5: Promise.allSettled 详细:官方介绍
The
Promise.allSettled
method accepts an array of Promises and only resolves when all of them are settled – either resolved or rejected.This was not available natively before, even though some close implementations like
race
and all
were available. This brings "Just run all promises – I don't care about the results" natively to JavaScript.文章图片
6: String.prototype.matchAll 详细:官方介绍
matchAll
is a new method added to the String
prototype which is related to Regular Expressions. This returns an iterator which returns all matched groups one after another.simple example:
文章图片
Let's have a look at another example.
using RegExp.exec:
var regex = /t(e)(st(\d?))/g;
var string = 'test1test2test3';
var matches = [];
var match;
while (match = regex.exec(string)) {
matches.push(match);
}matches
// [
//["test1", "e", "st1", "1", index: 0, input: "test1test2test3"],
//["test2", "e", "st2", "2", index: 5, input: "test1test2test3"],
//["test3", "e", "st3", "3", index: 10, input: "test1test2test3"]
// ]
using String.matchAll:
const string = 'test1test2test3';
const regex = /t(e)(st(\d?))/g;
for (const match of string.matchAll(regex)) {
console.log(match);
}
// ["test1", "e", "st1", "1", index: 0, input: "test1test2test3"]
// ["test2", "e", "st2", "2", index: 5, input: "test1test2test3"]
// ["test3", "e", "st3", "3", index: 10, input: "test1test2test3"]
7: globalThis 详细:官方介绍
If you wrote some cross-platform JS code which could run on Node, in the browser environment, and also inside web-workers, you'd have a hard time getting hold of the global object.
This is because it is
window
for browsers, global
for Node, and self
for web workers. If there are more runtimes, the global object will be different for them as well.So you would have had to have your own implementation of detecting runtime and then using the correct global – that is, until now.
ES2020 brings use
globalThis
which always refers to the global object, no matter where you are executing your code:文章图片
A horrifying globalThis polyfill in universal JavaScript
(function (Object) {
typeof globalThis !== 'object' && (
this ?
get() :
(Object.defineProperty(Object.prototype, '_T_', {
configurable: true,
get: get
}), _T_)
);
function get() {
this.globalThis = this;
delete Object.prototype._T_;
}
}(Object));
8: Module Namespace Exports In JavaScript modules, it was already possible to use the following syntax:
import * as utils from './utils.mjs'
However, no symmetric
export
syntax existed, until now:export * as utils from './utils.mjs'
This is equivalent to the following:
import * as utils from './utils.mjs'
export { utils }
9: Well defined for-in order 介绍:官方文档
The ECMA specification did not specify in which order
for (x in y)
should run. Even though browsers implemented a consistent order on their own before now, this has been officially standardized in ES2020.10: import.meta 详细:官方介绍
The
import.meta
object was created by the ECMAScript implementation, with a null
prototype.Consider a module,
module.js
:
You can access meta information about the module using the
import.meta
object:console.log(import.meta);
// { url: "file:///home/user/module.js" }
It returns an object with a
url
property indicating the base URL of the module. This will either be the URL from which the script was obtained (for external scripts), or the document base URL of the containing document (for inline scripts).Conclusion I love the consistency and speed with which the JavaScript community has evolved and is evolving. It is amazing and truly wonderful to see how JavaScript came from a language which was booed on, 10 years go, to one of the strongest, most flexible and versatile language of all time today.
Do you wish to learn JavaScript and other programming languages in a completely new way? Head on to a new platform for developers I'm working on to try it out today!
What's your favorite feature of ES2020? Tell me about it by tweeting and connecting with me on Twitter and Instagram!
This is a blog post composed from my video which is on the same topic. It would mean the world to me if you could show it some love!
推荐阅读
- 事件代理
- 数组常用方法一
- JavaScript|vue 基于axios封装request接口请求——request.js文件
- JavaScript|JavaScript: BOM对象 和 DOM 对象的增删改查
- JavaScript|JavaScript — 初识数组、数组字面量和方法、forEach、数组的遍历
- JavaScript|JavaScript — call()和apply()、Date对象、Math、包装类、字符串的方法
- JavaScript|JavaScript之DOM增删改查(重点)
- 【读书笔记】JavaScript|【读书笔记】JavaScript DOM编程艺术 (第2版)
- JavaScript判断数组的方法总结与推荐
- javascript|javascript 性能测试笔记