【ES11、ES12、ES13 新特性】

3 篇文章 0 订阅

ES11 新特性:

1. 可选链操作符 ?.:在访问对象的属性或方法时,可以使用可选链操作符来避免因为对象不存在或属性不存在导致的异常错误。

JS可选链操作符 ?.用于简化在访问可能为null或undefined的对象或属性时的代码。它的主要使用方法如下:

  1. 访问嵌套的属性或方法
const obj = {
  prop1: {
    prop2: {
      prop3: 'value'
    }
  }
};

const propValue = obj?.prop1?.prop2?.prop3; // 'value'

在ES12新出了可选链操作符 ?. 的升级:支持对函数的调用、数组的访问和对值类型的存取
如果嵌套的属性或方法不存在,那么可选链操作符会返回undefined,而不是抛出TypeError。

  1. 调用函数(方法)
const obj = {
  prop1: {
    doSomething: () => 'done'
  }
};

const result = obj?.prop1?.doSomething?.(); // 'done'

如果函数不存在,那么调用会被跳过,以避免抛出TypeError。

  1. 处理数组
const arr = [ 
  { name: 'Peter', age: 25 },
  { name: 'John', age: 30 },
  null,
  undefined
];

const age = arr[1]?.age; // 30

const nonExistent = arr[3]?.nonExistent?.property; // undefined

在访问数组中的元素时,可选链操作符可以防止抛出TypeError。

除此之外,可选链操作符还可以用于访问对象的Symbol属性和Proxy代理对象中的属性等。需要注意的是,可选链操作符在ES2020中才被引入,因此有些浏览器或Node.js版本可能不支持它。可以使用Babel等工具进行转译。

2. Nullish coalescing 操作符 ??:用于判断变量是否为 null 或者 undefined,并给出默认值。

Nullish coalescing 操作符 ?? 可以用来检查一个值是否为 null 或 undefined,如果是,则返回默认值,如果不是,则返回该值。

使用方法如下:

let variable1 = null;
let variable2 = undefined;
let variable3 = 0;
let variable4 = '';

console.log(variable1 ?? 'default value'); // 输出 'default value'
console.log(variable2 ?? 'default value'); // 输出 'default value'
console.log(variable3 ?? 'default value'); // 输出 0
console.log(variable4 ?? 'default value'); // 输出 ''

在上面的例子中,变量 variable1variable2 的值为 null 和 undefined,所以使用 ?? 操作符返回了指定的默认值。变量 variable3variable4 的值不是 null 或 undefined,所以返回了它们的原始值。

3. Promise.allSettled() 方法:可以接收一组 Promise,不管 Promise 是否被解析,都会返回一个状态为“已解析”的 Promise 数组。

Promise.allSettled() 方法接受一个 Promise 数组,它返回一个新的 Promise 对象,该对象将在所有 Promise 完成或拒绝后解决。与 Promise.all() 不同的是,即使其中一些 Promise 被拒绝,返回的 Promise 仍将被解决。返回的 Promise 将解决一个带有所有 Promise 结果的数组,每个 Promise 结果都是一个带有以下属性的对象:

  • status:表示 Promise 的状态,可以是 “fulfilled” 或 “rejected”。
  • value(如果状态为 “fulfilled”):表示解决的值。
  • reason(如果状态为 “rejected”):表示拒绝的原因。

下面是 Promise.allSettled() 方法的使用方法:

Promise.allSettled(promises)
  .then(results => {
    results.forEach(result => {
      if (result.status === "fulfilled") {
        console.log(`Promise resolved with value: ${result.value}`);
      } else {
        console.log(`Promise rejected with reason: ${result.reason}`);
      }
    });
  })
  .catch(error => console.error(error));

其中,promises 是一个 Promise 数组,results 是一个带有所有 Promise 结果的数组。在结果数组中,每个 Promise 结果可以访问 statusvaluereason 属性,以根据 Promise 的状态确定结果。在 .then() 方法中,您可以使用 forEach() 循环来遍历每个 Promise 结果并执行相应的操作。

如果 Promise 数组中任何一个 Promise 被拒绝,则在返回的 Promise 上调用的 .catch() 方法将捕获该错误。

4. String.prototype.replaceAll() 方法:用于替换字符串中所有匹配的子字符串。

String.prototype.replaceAll() 方法是用于替换字符串中所有匹配的子字符串的方法。该方法需要传入两个参数:要匹配的子字符串和用来替换匹配的字符串。它返回一个新的字符串,该字符串是由原字符串中所有匹配的子字符串替换成指定字符串后的结果。

使用示例:

const str = 'hello world!';
const newStr = str.replaceAll('l', 'x');
console.log(newStr); // 'hexxo worxd!'

在上面的例子中,我们调用了 replaceAll() 方法来将 str 中所有的 l 字符替换成 x 字符。执行结果为 'hexxo worxd!'

需要注意的是,该方法是在 ES2021 中引入的,因此在一些旧的浏览器版本中可能不支持,需要使用 polyfill 或其他替代方案来实现。

ES12 新特性:

1. 可选链操作符 ?. 的升级:支持对函数的调用、数组的访问和对值类型的存取。(见上)

2. Promise.any() 方法:在传入的一组 Promise 中至少有一个解析(或拒绝)时才会返回 Promise 解析的方法。

Promise.any() 方法接收一个 Promise 对象数组,返回数组中第一个成功的 Promise 对象的值。如果所有 Promise 对象都失败了,则返回一个 AggregateError 对象,其中包含所有 Promise 对象的 rejection 原因。

以下是 Promise.any() 方法的用法示例:

const promise1 = Promise.resolve(1);
const promise2 = Promise.resolve(2);
const promise3 = Promise.reject('Error 3');

Promise.any([promise1, promise2, promise3])
  .then(result => console.log(result))
  .catch(error => console.log(error));
  
// Output:
// 1

在上述示例中,我们创建了三个 Promise 对象,其中 promise1 和 promise2 成功地解决并返回它们的值,而 promise3 失败并抛出一个错误。使用 Promise.any() 方法,我们传递了一个包含这三个 Promise 对象的数组。由于 promise1 和 promise2 都成功了,Promise.any() 方法返回第一个成功的 Promise 对象的值,也就是 1。

如果我们将 promise3 从数组中移除,则 Promise.any() 方法就会抛出一个 AggregateError 对象,其中包含 promise1 和 promise2 的 rejection 原因。

const promise1 = Promise.resolve(1);
const promise2 = Promise.resolve(2);
const promise3 = Promise.reject('Error 3');

Promise.any([promise1, promise2])
  .then(result => console.log(result))
  .catch(error => console.log(error));

// Output:
// AggregateError: All promises were rejected
//    at <anonymous>
//    at processTicksAndRejections (internal/process/task_queues.js:97:5)

需要注意的是,Promise.any() 方法是在 ES2021 中引入的,因此,在一些较旧的浏览器或 Node.js 版本中可能无法使用。

3. WeakRef 和 Finalizer API:可以使开发者更好地控制内存管理。

JavaScript中的WeakRef和Finalizer API是ES2021的新特性,它们旨在帮助开发人员更轻松地管理内存。

WeakRef允许开发人员创建一个对对象的弱引用,这意味着当对象不再被程序中的任何强引用所引用时,它将被标记为可回收。它的语法如下:

const weakRef = new WeakRef(object);

其中,object是要创建弱引用的对象。当程序中不再有任何强引用时,我们可以通过调用weakRef.deref()方法来获取弱引用指向的对象。如果对象已经被回收,deref()方法将返回undefined。

Finalizer API 允许开发人员在内存回收之前执行一些操作,比如清理资源或日志。它的语法如下:

new FinalizationRegistry(callback);

其中,callback是在对象被回收时调用的回调函数。当创建一个FinalizationRegistry对象时,它会返回一个注册对象的方法:

registry.register(object, data, [holdTime]);

其中,object是要注册的对象,data是一个任意的额外数据,holdTime是对象在没有任何强引用时保留的时间,以毫秒为单位。当对象被回收时,callback函数将被调用并传入注册时提供的data参数。

使用WeakRef和Finalizer API可以帮助开发人员更好地管理内存并清理资源。但是,由于这些API是新的,有些浏览器可能不支持它们。在使用之前,请确保您的目标平台支持这些API。

4. 数字分隔符:在数字中使用下划线作为分隔符,更容易阅读和理解数字。

JS数字分隔符是一个新的特性,它可以将数字用下划线或空格分隔成更易读的形式,而不会影响数字的值。例如:

let million = 1_000_000;
let pi = 3.14159_26535;
let binary = 0b1010_0001_1000_0101;

这里,数字1,000,000被写为1_000_000,数字3.1415926535被写为3.14159_26535,数字二进制1010000110000101被写为0b1010_0001_1000_0101。

注意,数字中的下划线不能放在数字的开头或结尾,也不能放在小数点前后,也不能在科学计数法中的e或E的前后。此外,在旧版本的浏览器中,数字分隔符可能不被支持,需要使用polyfill来实现。

5. String.prototype.matchAll() 方法:用于查找所有匹配一个正则表达式的字符串,返回一个迭代器。

JavaScript中的String.prototype.matchAll()方法可以在字符串中检索所有匹配正则表达式模式的结果,返回一个迭代器对象,可以通过该对象依次访问每个匹配项的详细信息。

该方法接收一个正则表达式作为参数,并返回一个迭代器对象。每个匹配项都是一个数组,包含匹配的子字符串及其相关信息,例如匹配的位置、捕获组等。

下面是一个示例:

const str = "Hello world, hello JavaScript!";
const regex = /(hello) (\w+)/gi;

const matches = str.matchAll(regex);

for (const match of matches) {
  console.log(match);
}

输出:

["hello world", "hello", "world", index: 0, input: "Hello world, hello JavaScript!", groups: undefined]
["hello JavaScript", "hello", "JavaScript", index: 13, input: "Hello world, hello JavaScript!", groups: undefined]

可以看到,迭代器返回了两个匹配项,每个匹配项都是一个数组,第一个元素是匹配的子字符串,接下来的元素是捕获组的值,最后是一些附加信息。在这个例子中,正则表达式匹配了两次,分别是"hello world"和"hello JavaScript"。

需要注意的是,String.prototype.matchAll()方法是ES2018新增的方法,需要在支持该方法的浏览器或Node.js版本中使用。如果需要支持低版本的环境,可以使用RegExp.prototype.exec()方法以及循环来实现类似的功能。

ES13 新特性:

1. BigInt:用于表示任意精度整数。(ES11就出了,放错位置了,抱歉)

BigInt 是 JavaScript 中新增的数据类型,用于表示任意精度的整数。在旧版 JavaScript 中,数字类型的最大值为 2^53 - 1,超出这个范围的整数会出现精度问题。BigInt 可以解决这个问题,可以表示任意大的整数。以下是 JS BigInt 的使用方法:

  1. 在数字后面加 n 表示一个 BigInt,例如 1234567890n
  2. 使用 BigInt() 函数将一个数字转换成 BigInt 类型,例如 BigInt(123456)
  3. BigInt 可以进行常见的数学操作,例如 +, -, *, /% 等。
  4. 注意,在使用 BigInt 进行数学操作时,需要使用 BigInt 类型的变量或字面量,不能和数字类型混合计算。

下面是一个简单的示例,展示了如何使用 BigInt:

// 创建 BigInt 变量
const a = 12345678901234567890n;
const b = BigInt(9876543210);

// 进行数学操作
const c = a + b;
const d = a - b;
const e = a * b;
const f = a / b;
const g = a % b;

// 输出结果
console.log(c); // 12345678911111111100n
console.log(d); // 12345678901224791380n
console.log(e); // 121932631137021824023361955n
console.log(f); // 1249999999n
console.log(g); // 1234567880n

注意,旧版浏览器可能不支持 BigInt 数据类型。在这种情况下,可以使用第三方库,例如 bigint-polyfill

2. Nullish coalescing 操作符 ?? 的升级:可以支持更多的逻辑运算符。(见上)

3. Optional catch binding:在 catch 子句中声明的变量不再是强制性的,如果变量名省略,则不会创建绑定。

ES2019 引入了可选的 catch 绑定语法,可以更方便地访问 catch 块中的错误信息。在以前的版本中,我们需要在 catch 块中手动创建一个变量来存储错误信息。

Optional catch binding 可以用于以下情况:

  1. 如果 catch 块中不需要访问错误信息,可以省略参数。
  2. 如果需要访问错误信息,可以使用 catch (error) 或 catch (e) 来访问错误信息。

下面是一些使用 Optional catch binding 的例子:

try {
  // some code
} catch {
  // handle error
}

try {
  // some code
} catch (error) {
  // handle error
}

try {
  // some code
} catch (e) {
  // handle error
}

使用 Optional catch binding 不仅可以简化代码,而且可以使代码更清晰易懂。

4. Array.prototype.flat() 和 Array.prototype.flatMap() 方法:用于处理多维数组和映射操作。

Array.prototype.flat():

这个方法可以把一个嵌套的数组“拍平”,变成一个一维数组。它的参数是一个整数,表示要拍平的层数,默认为1。如果层数为Infinity,则会对所有嵌套进行拍平。

例如,有一个三层嵌套的数组:

const arr = [1, 2, [3, 4, [5, 6, [7, 8]]]];

使用 flat() 方法:

const newArr = arr.flat(3);
console.log(newArr); // [1, 2, 3, 4, 5, 6, 7, 8]

Array.prototype.flatMap():

这个方法可以对数组的每个元素执行一个函数,然后把执行结果“拍平”成一个新数组。它的参数是一个函数,该函数接受三个参数:当前元素、元素索引、原数组。

例如,有一个数组:

const arr = [1, 2, 3];

使用 flatMap() 方法:

const newArr = arr.flatMap(x => [x * 2]);
console.log(newArr); // [2, 4, 6]

上述例子中,我们把每个元素乘以2,然后把执行结果“拍平”成一个新数组。结果为[2, 4, 6]。注意,如果函数返回的是一个数组,flatMap() 方法会“拍平”这个数组。例如:

const arr = [1, 2, 3];
const newArr = arr.flatMap(x => [[x * 2]]);
console.log(newArr); // [[2], [4], [6]]

5. Object.fromEntries() 方法:可以将键值对数组转换成对象。

JavaScript的Object.fromEntries()方法可以将由键值对数组组成的数组转换为对象。

语法:

Object.fromEntries(iterable)

参数:

  • iterable:一个可迭代对象,每个成员都是一个键值对数组。

返回值:

  • 一个新的对象,其自身属性具有从iterable中的键值对所构成的。

示例:

const entries = [['a', 1], ['b', 2], ['c', 3]];
const obj = Object.fromEntries(entries);
console.log(obj); // { a: 1, b: 2, c: 3 }

在这个例子中,我们将由键值对数组组成的数组entries转换为对象obj。现在,obj中的属性就是键值对数组中的键和值。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: Webpack 是一个现代 JavaScript 应用程序的静态模块打包器。它主要用于打包 JavaScript 模块,但也可以将 CSS、图片、字体等其他类型的文件转换成 JavaScript 模块。Webpack 可以将应用程序中的所有资源视为模块,然后根据这些模块的依赖关系,打包成一个或多个静态资源。以下是前端webpack的基本用法: 1. 安装 webpack 和 webpack-cli 使用 npm 安装 webpack 和 webpack-cli: ``` npm install webpack webpack-cli --save-dev ``` 2. 创建 webpack 配置文件 在项目根目录下创建一个名为 `webpack.config.js` 的文件,该文件包含有关如何打包应用程序的配置选项。 3. 配置入口和出口 在 `webpack.config.js` 文件中,配置打包入口和出口: ``` module.exports = { entry: './src/index.js', output: { filename: 'bundle.js', path: path.resolve(__dirname, 'dist') } }; ``` 其中 `entry` 指定应用程序的入口点(即主要的 JavaScript 文件),`output` 指定打包后的文件名和目录。 4. 配置加载器 Webpack 可以使用加载器来处理非 JavaScript 文件。例如,可以使用 `babel-loader` 将 ES6+ 代码转换成 ES5 代码,或使用 `css-loader` 和 `style-loader` 处理 CSS 文件。在 `webpack.config.js` 文件中配置加载器: ``` module.exports = { // ... module: { rules: [ { test: /\.js$/, exclude: /node_modules/, use: { loader: 'babel-loader' } }, { test: /\.css$/, use: ['style-loader', 'css-loader'] } ] } }; ``` 上面的配置使用 `babel-loader` 处理所有 `.js` 文件,并使用 `css-loader` 和 `style-loader` 处理所有 `.css` 文件。 5. 运行 webpack 使用以下命令运行 webpack: ``` npx webpack ``` 这将根据 `webpack.config.js` 文件中的配置打包应用程序,并将打包后的文件输出到指定的目录中。 ### 回答2: 前端Webpack是一个模块打包工具,它主要用于将多个前端资源文件(如HTML、CSS、JavaScript等)进行打包、压缩、优化和管理。下面是前端Webpack的用法: 1. 安装Webpack:使用npm或yarn进行安装,运行命令`npm install webpack --save-dev`。 2. 创建Webpack配置文件:在项目根目录下创建一个名为webpack.config.js的文件,用于配置Webpack的相关参数和打包规则。 3. 配置入口文件:在webpack.config.js中配置entry,指定Webpack打包的入口文件。 4. 配置输出路径:在webpack.config.js中配置output,指定Webpack打包后的文件输出路径和文件名。 5. 配置加载器:在webpack.config.js中配置module,使用不同的加载器(loader)对不同类型的文件进行解析和转换,例如babel-loader用于转换ES6语法为ES5语法。 6. 配置插件:在webpack.config.js中配置plugins,使用插件对打包后的文件进行优化、压缩和处理,例如uglifyjs-webpack-plugin用于压缩JavaScript代码。 7. 运行Webpack:使用命令行在项目根目录运行`webpack`命令,Webpack会根据配置文件进行打包并输出打包结果。 8. 高级特性:Webpack还支持一些高级特性,如代码分割、动态加载、DevServer等,可以根据需要进行配置和使用。 总结:前端Webpack是一个功能强大的模块打包工具,通过配置文件对前端资源进行打包、压缩和处理,提升前端开发效率和性能。它的用法包括安装Webpack、创建配置文件、配置入口和输出路径、配置加载器和插件等,通过命令行运行Webpack进行打包。同时,Webpack还提供一些高级特性,进一步扩展了其功能。 ### 回答3: Webpack是一个现代的前端模块打包工具,它能够将多个前端资源(如JavaScript文件、CSS文件、图片等)打包成一个或多个静态资源文件。通过使用Webpack,我们可以有效地管理和优化项目的前端资源。 前端使用Webpack有以下几个主要用法: 1. 打包JavaScript模块:Webpack最常见的用法就是打包JavaScript模块。我们可以通过Webpack的入口文件指定需要打包的JavaScript文件,Webpack会根据这些文件的依赖关系,将它们打包成一个或多个bundle.js文件。同时,Webpack还可以通过Babel等工具将ES6/ES7等新版JavaScript转换为ES5,以提供更好的兼容性。 2. 处理CSS和预处理器:Webpack可以将多个CSS文件合并并打包成一个bundle.css文件。我们可以在CSS文件中使用import语法,引用其他CSS文件或预处理器文件(如Sass、Less等),Webpack会自动处理这些文件的依赖关系,并将它们合并到最终的CSS文件中。 3. 处理图片和字体文件:Webpack可以识别并打包CSS中引用的图片和字体文件,将它们输出到指定的目录中。同样,Webpack会根据文件的依赖关系,将它们合并到最终的静态资源文件中。 4. 插件和优化:Webpack支持各种插件,用于额外的功能增强和优化。例如,通过使用UglifyJS插件可以压缩JavaScript代码,通过使用ExtractTextPlugin插件可以将CSS提取到单独的文件中,通过使用HtmlWebpackPlugin插件可以自动生成HTML文件等等。 总之,Webpack是一个非常强大且灵活的前端构建工具,它可以大大提升前端项目的开发效率和性能。但需要注意的是,在使用Webpack时,我们需要配置和调试一些复杂的参数,因此需要一定的学习和使用成本。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值