ECMAScript 2024 会有哪些新特性?

本文探讨了ECMAScript 2024可能引入的新特性,包括顶层await的使用,它解决了异步模块导入的不确定性问题。此外,还介绍了类的实例成员变化,如公共实例字段、私有实例字段、方法和访问器的增强,以及静态公共和私有字段的引入,这些改进旨在简化和强化JavaScript的类语法。同时,文章提到了类静态初始化块,提供了一种处理异常的安全方式。最后,文章简要提及了Temporal提案,它是JavaScript中处理日期和时间的新标准,旨在解决现有Date对象的问题,提供更强大和灵活的日期处理功能。
摘要由CSDN通过智能技术生成

export { users };

// usingAwait.js

import {users} from ‘./a.js’;

console.log('users: ', users);

console.log(‘usingAwait module’);

我们还可以立即调用顶层async函数(IIAFE):

import fetch  from “node-fetch”;

(async () => {

const resp = await fetch(‘https://jsonplaceholder.typicode.com/users’);

users = resp.json();

})();

export { users };

这样会有一个缺点,直接导入的 users 是 undefined,需要在异步执行完成之后才能访问它:

// usingAwait.js

import {users} from ‘./a.js’;

console.log(‘users:’, users); // undefined

setTimeout(() => {

console.log(‘users:’, users);

}, 100);

console.log(‘usingAwait module’);

当然,这种方法并不安全,因为如果异步函数执行花费的时间超过100毫秒, 它就不会起作用了,users 仍然是 undefined。

另一个方法是导出一个 promise,让导入模块知道数据已经准备好了:

//a.js

import fetch  from “node-fetch”;

export default (async () => {

const resp = await fetch(‘https://jsonplaceholder.typicode.com/users’);

users = resp.json();

})();

export { users };

//usingAwait.js

import promise, {users} from ‘./a.js’;

promise.then(() => {

console.log(‘usingAwait module’);

setTimeout(() => console.log(‘users:’, users), 100);

});

虽然这种方法似乎是给出了预期的结果,但是有一定的局限性:导入模块必须了解这种模式才能正确使用它。

而顶层await就可以消除这些缺点:

// a.js

const resp = await fetch(‘https://jsonplaceholder.typicode.com/users’);

const users = resp.json();

export { users};

// usingAwait.js

import {users} from ‘./a.mjs’;

console.log(users);

console.log(‘usingAwait module’);

顶级 await 在以下场景中将非常有用:

  • 动态加载模块

const strings = await import(/i18n/${navigator.language});

  • 资源初始化

const connection = await dbConnector();

  • 依赖回退

let translations;

try {

translations = await import(‘https://app.fr.json’);

} catch {

translations = await import(‘https://fallback.en.json’);

}

目前,在这些地方已经支持 Top-level await:

  • V8 v8.9

  • Webpack 5.0.0

  • Babel

  • Chrome DevTools REPL

  • Node REPL

二、类的实例成员


1. 公共实例字段

公共类字段允许我们使用赋值运算符 (=) 将实例属性添加到类定义中。下面来一个计数器的例子:

import React, { Component } from “react”;

export class Incrementor extends Component {

constructor() {

super();

this.state = {

count: 0,

};

this.increment = this.increment.bind(this);

}

increment() {

this.setState({ count: this.state.count + 1 });

}

render() {

return (

Increment: {this.state.count}

);

}

}

在这个例子中,在构造函数中定义了实例字段和绑定方法,通过新的类语法,我们可以使代码更加直观。新的公共类字段语法允许我们直接将实例属性作为属性添加到类上,而无需使用构造函数方法。这样就简化了类的定义,使代码更加简洁、可读:

import React from “react”;

export class Incrementor extends React.Component {

state = { count: 0 };

increment = () => this.setState({ count: this.state.count + 1 });

render = () => (

Increment: {this.state.count}

);

}

有些小伙伴可能就疑问了,这个功能很早就可以使用了呀。但是它现在还不是标准的 ECMAScript,默认是不开启的,如果使用 create-react-app 创建 React 项目,那么它默认是启用的,否则我们必须使用正确的babel插件才能正常使用(@babel/preset-env)。

下面来看看关于公共实例字段的注意事项:

  • 公共实例字段存在于每个创建的类实例上。它们要么是在
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值