首页 > 其他分享 >ES14新特性揭秘,对前端开发有哪些影响?

ES14新特性揭秘,对前端开发有哪些影响?

时间:2023-09-17 18:34:19浏览次数:55  
标签:arr const name toSorted 揭秘 Array prototype 前端开发 ES14

ECMAScript 2023也就是ES14已经发布3个月了,还有好多小伙伴没有关注到ES14有哪些变化,本文将为大家梳理下ES14最新规范新增功能:对数组的新增功能,对shebang的支持,对弱引用集合的符号键的扩展。这个版本的都是一些细微的改进,我们一起看看有哪些变更

目录

  • Array.prototype.toSorted
  • Array.prototype.toReversed
  • Array.prototype.with
  • Array.prototype.findLast
  • Array.prototype.findLastIndex
  • Array.prototype.toSpliced
  • 正式的 shebang 支持
  • Symbol 作为 WeakMap 的键
  • 总结

Array.prototype.toSorted

toSorted() 与 Array.prototype.sort() 具有相同的签名,但它创建一个新的数组,而不是对原数组进行操作。


let arr = [5, 4, 2, 3, 1];
arr === arr.sort(); // true - [1, 2, 3, 4, 5]

arr === arr.toSorted(); // false - [1, 2, 3, 4, 5]

toSorted() 和 sort() 一样,接受一个可选参数作为比较函数。例如,我们可以使用 toSorted() 创建一个按降序排列的新数组

const numbers = [10, 5, 2, 7, 3, 9, 1, 6, 4];
const sortedNumbers = numbers.toSorted((a, b) => {
  return b - a;
});
console.log(sortedNumbers); // [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]

需要注意的是,toSorted() 也可以应用于对象数组。这种情况下,需要提供一个使用对象上的数据的比较函数,因为对象没有自然的排序方式。

// 比较对象
const objects = [
  { name: "John", age: 30 },
  { name: "Jane", age: 25 },
  { name: "Bill", age: 40 },
  { name: "Mary", age: 20 }
];
const sortedObjects = objects.toSorted((a, b) => {
  return a.name.localeCompare(b.name);
});
console.log(sortedObjects);
// [{"name":"Bill","age":40},{"name":"Jane","age":25},{"name":"John","age":30},{"name":"Mary","age":20}]

Array.prototype.toReversed

与 toSorted() 和 sort() 一样,toReversed() 是 reverse() 的复制版本。

代码清单 4. toReversed()

["a", "b", "c", "d", "e"].toReversed(); // ['e', 'd', 'c', 'b', 'a']

Array.prototype.with

新的 with() 方法允许您基于索引修改单个元素,并返回一个新的数组。因此,如果您知道索引和新值,这个方法非常方便。需要注意的是with() 是 set() 的复制伴侣。


const arr4 = ["I", "am", "the", "Walrus"];

// 用 "Ape Man" 替换字符串 "Walrus"。
const newArr4 = arr4.with(3, "Ape Man");

console.log(newArr4);

Array.prototype.findLast

findLast() 方法允许您从数组中获取匹配元素的最后一个实例。如果找不到匹配元素,则返回 undefined。下面代码中提供了一个简单的示例,我们从数组中获取最后一个偶数。


const arr = [54, 34, 55, 75, 98, 77];

const lastEvenIndex = arr.findLast((element) => {
  return element % 2 === 0;
});

console.log(lastEvenIndex); // 98

findLast() 还支持传递一个 "thisArg" 来设置上下文。也就是说,第二个参数将告诉第一个参数函数 this 关键字将引用什么。从下面代码中看到这一点,我们使用一个自定义对象来找到可以被 5 整除的第一个元素。


const arr6 = [54, 34, 55, 75, 98, 77];
const myObject = { testCase: 5 };
const lastEvenIndex = arr5.findLast((element) => {
  return element % myObject.testCase === 0;
}, myObject);

console.log(lastEvenIndex); // 75

Array.prototype.findLastIndex

findLastIndex() 的工作方式与 findLast() 相同,只是它返回匹配元素的索引而不是元素本身。例如,下面例子展示如何找到最后一个可以被 6 整除的元素的索引。

代码清单 8. 使用 findLastIndex() 找到元素的索引

const arr = [54, 34, 55, 75, 98, 77];
arr.findLastIndex(x => x % 6 === 0); // 0

Array.prototype.toSpliced

上面新增的所有方法也适用于 TypedArray,但 toSpliced() 这个新的数组方法只存在于 Array 中。toSpliced() 方法是 splice() 的复制版本,splice()是js中数组操作常用的方法;

假设我们有一个颜色数组,需要在中间插入一些新的颜色(粉红色和青色)。这会创建一个新数组,而不是修改原始数组。


const arr = ["red", "orange", "yellow", "green", "blue", "purple"];
const newArr = arr.toSpliced(2, 1, "pink", "cyan");
console.log(newArr);
// ["red", "orange", "pink", "cyan", "green", "blue", "purple"]
console.log(newArr[3]);
// 'cyan'
console.log(arr[3]);
// 'green'

正式的 shebang 支持

Shebang 是旧式 Unix 术语,表示井号后跟一个感叹号:#!(其中 "bang" 是感叹号的俚语)。

#!/bin/bash

echo "Hello, world!"

您可以使用 ./hello.sh 直接运行上面代码。

您也可以在 JavaScript 中执行类似操作,如代码清单 11 所示。

#!/usr/bin/env node

console.log("Hello, world!");

上面例子告诉操作系统使用 node 程序来运行此脚本。只需键入 ./hello.js 即可运行它。如果没有 #!是无法运行的。

Shebang 支持是规范中已经实现并在多种情境下非正式采用的特性之一。

Symbol 作为 WeakMap 的键

ES14中的最后一个新功能是Symbol 可以作为 WeakMap 的键使用。在这之前,WeakMap仅允许对象作为键值,新特性更容易创建和共享key。

var map = new WeakMap(); // 创建一个弱映射
function useSymbol(symbol){
    doSomethingWith(symbol);
    var called = map.get(symbol) || 0

上面的例子允许从外部调用者调用计数器,并在不再有引用时释放映射条目。代码本身无法知道何时不再需要引用,如果使用普通的 Map,将会导致内存泄漏。这是因为即使在调用它的客户端不再需要引用时,代码仍然会保留对该引用的持有。在这种情况下使用 WeakMap,可以确保垃圾回收在不再存在对键符号的引用时删除映射条目。

总结

虽然 ES14 的规范刚发布不久,但是本文提到新增的数组api已经得到了主流浏览器支持。Chrome 110、Safari 16.3、Node.js 20 和 Deno1.31 都支持这四种新方法。感兴趣的小伙伴快去玩玩吧。

标签:arr,const,name,toSorted,揭秘,Array,prototype,前端开发,ES14
From: https://www.cnblogs.com/dawnyu/p/17709396.html

相关文章

  • 欢迎来到小码哥的博客 博客搬家啦 blog.ma6174.com 西邮Linux小组免试题揭秘
    还记得东京大学情报理工学系的招生海报吗?只要答对了问题,然后你就被录取了。当时可火了,人人和微博疯狂转载。如今西邮Linux小组也搞了个这样题目,只要你能答对,就能免试进入西邮Linux小组!感觉挺好玩,遂挑战一把。题目原文在这里:http://www.xiyoubbs.com/thread-81454-1-1.html第......
  • 前端开发的未来:Web组件化与可视化编程探索
    随着互联网的快速发展,前端开发领域也日新月异。为了满足越来越多复杂的需求和提高开发效率,前端开发不断演进。本文将深入探讨前端开发的未来,重点关注Web组件化和可视化编程,这两个领域有望改变前端开发的方式。1.Web组件化的兴起Web组件化是前端开发的一个重要趋势,它旨在将Web应......
  • 揭秘10个Chat Emy兼职赚钱策略
    在当今数字时代,创造一个有利可图的副业从未如此便利。随着科技的发展,强大的AI语言模型ChatEmy为那些希望增加额外收入的个人开辟了新的途径。在这份全面的指南中,我们将探讨利用ChatEmy潜力的十种巧妙策略,打造您自己的副业帝国。1、利用ChatEmy进行特定领域创作将Cha......
  • 最高提升10倍性能!揭秘火山引擎ByteHouse查询优化器实现方案
     更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群 作为企业级数据库的核心组件之一,查询优化器的地位不可忽视。对于众多依赖数据分析的现代企业来说,一个强大且完善的查询优化器能够为数据管理和分析工作带来巨大的便利。 作为火山引......
  • YashanDB混合存储大揭秘:行式存储设计如何为高效TP业务保驾护航(上)
    上一篇文章《揭秘YashanDB融合存储引擎》https://mp.weixin.qq.com/s/yipJcEAH3fVA-_hnUvOiKA从存储结构、事务引擎、高可用等方面介绍了YashanDB存储引擎的整体架构。本篇为大家详细解读YashanDB行式存储技术。背景数据库底层组织数据的方式主要分为行式存储和列式存储两大类。Yas......
  • YashanDB混合存储大揭秘:行式存储设计如何为高效TP业务保驾护航
    接上篇内容插入性能优化YashanDB行式存储主要从提供并发度、批量化处理以及减少日志产生三方面对事务处理过程中的插入性能进行了优化:1提高并发度单线程插入的速度是有限的,在资源充足的场景下,我们希望通过增加线程来提高导入数据的速度。由于数据块不能同时写入,如果两个线程要在同......
  • 编写高质量代码:Web前端开发修炼之道
    编写高质量代码:Web前端开发修炼之道》是一本很实用的Web前端开发书籍。它不仅介绍了如何编写高质量的代码,还提供了一些实践方法和技巧,帮助读者提升自己的Web前端开发技能。无论是初学者还是有一定经验的开发者,都可以从这本书中获得一些有价值的知识和经验。下载:https://pan.quark.c......
  • 火山引擎 ByteHouse:两个关键技术,揭秘 OLAP 引擎中的数据导入技术
    更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群数据导入是衡量OLAP引擎性能及易用性的重要标准之一,高效的数据导入能力能够加速数据实时处理和分析的效率。作为一款OLAP引擎,火山引擎云原生数据仓库ByteHouse源于开源ClickHouse,在字节跳......
  • 火山引擎 ByteHouse:两个关键技术,揭秘 OLAP 引擎中的数据导入技术
     更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群 数据导入是衡量OLAP引擎性能及易用性的重要标准之一,高效的数据导入能力能够加速数据实时处理和分析的效率。 作为一款OLAP引擎,火山引擎云原生数据仓库ByteHouse源于开源C......
  • Redis大揭秘:如何秒级存入百万数据?
    大家好,我是小米,一个热爱技术分享的小伙伴。最近在面试中遇到了一个有趣的问题:Redis里怎么快速存入百万数据?今天,我就来和大家分享一下这个有趣的问题,希望对大家有所帮助。Redis简介首先,让我们来简单了解一下Redis。Redis是一个高性能的键值存储系统,被广泛用于缓存、队列和实时分......