2023款ECMAScript

news2025/1/15 13:33:10

2023款ECMAScript

新的数组api

findLast

反向迭代数组,并返回满足提供的测试函数的第一个元素的值, 如果没有找到返回undefined

const isEven = (number) => number % 2 === 0;
const numbers = [1, 2, 3, 4];
console.log(numbers.findLast(isEven)); // 4

findLastIndex

反向迭代数组,并返回满足所提供的测试函数的第一个元素的索引。若没有找到对应元素,则返回 -1

const isEven = (number) => number % 2 === 0;
const numbers = [1, 2, 3, 4];
console.log(numbers.findLastIndex(isEven)); // 3

如果预计查找的元素靠后,使用findLast和findLastIndex 可以减少查询次数,提高程序效率。

toSorted

sort方法的复制版本,复制原数组,然后对新数组排序,并返回新数组。

排序逻辑和参数都和sort方法一样

const array = [3, 2, 1];
const sortedArray = array.toSorted();
console.log(sortedArray); // [1, 2, 3]
console.log(array); // 原数组不变 [3, 2, 1]

toReversed

reverse方法的复制版本;复制数组原数组,对新数组颠倒顺序,并返回新数组。

const original = [1, 2, 3, 4];
const reversed = original.toReversed();
console.log(original);  // [ 1, 2, 3, 4 ] 原数组不变
console.log(reversed);  // [ 4, 3, 2, 1 ]

toSpliced

splice() 方法的复制版本。它返回一个新数组,并在给定的索引处删除和/或替换了一些元素。

const original = ["Jan", "Mar", "Apr", "May"];
  // 在索引 1 处添加一个元素
  const spliced = months.toSpliced(1, 0, "Feb");
  console.log(spliced); // ["Jan", "Feb", "Mar", "Apr", "May"]
  console.log(original); // ["Jan", "Mar", "Apr", "May"]  原数组不变

with

使用方括号表示法修改指定索引值的复制方法版本

const arr = [1, 2, 3, 4, 5];
console.log(arr.with(2, 6)); // [1, 2, 6, 4, 5]
console.log(arr); // [1, 2, 3, 4, 5] 原数组不变

📌toSorted、toReversed、toSpliced、with在处理数组的时候会将稀疏数组的空值转成undefined

const arr = [1, , 3, 4, , 6];
console.log(arr.with(0, 2)); // [2, undefined, 3, 4, undefined, 6]

📌toSorted、toReversed、toSpliced、with可以使用call或者apply在类数组对象上应用

function fn1(){
    console.log(Array.prototype.with.call(arguments,2,6)); // [1,2,6,4,5]
  }
  fn1(1,2,3,4,5)
  
  const arrayLike = {
    length: 3,
    unrelated: "foo",
    0: 5,
    2: 4,
  };
  console.log(Array.prototype.with.call(arrayLike, 0, 1));
  // [ 1, undefined, 4 ]

toSorted、toReversed、toSpliced、with在实际工作中是非常有用的,尤其在react中使用immutable data进行状态更新的时候,  这四个api能很大程度简化操作,下面的例子是一个简单的todo组件例子。

function App(){
    const [items,setItems] = React.useState([{id:1,text:'学习',done:false},{id:2,text:'吃饭',done:false},{id:3,text:'睡觉',done:false}]);
    const removeItem = (index)=>{
      // 方法一 使用splice
      // setItems((prev)=>{
      //   const copy = [...prev];
      //   copy.splice(index,1);
      //   return copy;
      // })
      // 方法二 使用filter
      // setItems(prev=>prev.filter((_,i)=>i !== index ))
      // 方法三 使用toSpliced
      setItems(prev=>prev.toSpliced(index,1));
    }
    const toggleStatus = (index)=>{
      // 方法一 使用map
      // setItems(prev=>prev.map((item,i)=>{
      //   if(index === i){
      //     return {
      //       ...item,
      //       done: !item.done
      //     }
      //   }
      //   return item;
      // }))

      // 使用with
      setItems(prev=>prev.with(index, {
        ...prev[index],
        done: !prev[index].done
      }))
    }
    return (
      <div>
        {
          items.map((i,index)=>{
            return (
              <div key={i.id}>
                <input type="checkbox" checked={i.done} onChange={()=>toggleStatus(index)}/>
                <span>{i.text}</span>
                <button onClick={()=>removeItem(index)}>删除</button>
              </div>
            )
          })
        }
      </div>
    )
  }

WeakMap 支持 Symbol 作为键

const weak = new WeakMap();
const key = Symbol("ref");
weak.set(key, "ECMAScript 2023");

console.log(weak.get(key)); // ECMAScript 2023

Hashbang

这个在nodejs中已经早就应用了,其实规范落地没什么影响。

#!/usr/bin/env node

console.log('hi');

兼容性

开发环境支持:

目前最新版的ts支持findLast和findLastIndex, 但是还不支持toSpliced、toSorted、toReversed、with,在typescript仓库中已经有人提了pull request;如果等不及官方支持,可在项目中给global的Array添加对应的类型定义,参考pr:

https://github.com/microsoft/TypeScript/pull/51367/files[1]

f1ba80df6a9f0cbd344c2c53d5bcbf17.png

常用编辑器vscode和webstorm中语法还未支持,没有相关的语法提示,并且会有警告提示。

浏览器支持:

bb6b9047e24d1d40437c20d5ceb61ee7.png

polyfill

目前core-js已经支持数组的api, 但尚不支持WeakMap使用Symbol作为key来使用。

参考

https://github.com/tc39/proposals/blob/main/finished-proposals.md[2]

参考资料

[1]

add change array by copy types: https://github.com/microsoft/TypeScript/pull/51367/files

[2]

TC39 Finished Proposals: https://github.com/tc39/proposals/blob/main/finished-proposals.md

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/557738.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

华为战略方法论:BLM模型之市场洞察-五看工具篇(加餐)

欢迎大家继续来到华为战略方法论系列内容。 今天主要介绍一下市场洞察篇的延伸内容 —— 五看工具篇。 在BLM模型中&#xff0c;战略意图篇提到的愿景和目标能否实现&#xff0c;以及怎么实现呢&#xff1f; 要回答这个问题&#xff0c;你就需要从市场上去寻找依据。 企业需…

央国企数字化转型难在哪?为什么要数字化转型?

随着新一轮科技革命和产业变革深入发展&#xff0c;数字化成为央国有企业的必答题。 但就目前情况来看&#xff0c;央国有企业数字化转型还面临着许多挑战&#xff0c;必然是一个长期的过程。 01 央国企数字化转型难在哪&#xff1f; 根据调研数据&#xff0c;中央企业数字化…

linux修改ip地址详解

修改IP地址分为临时修改&#xff08;仍然属于动态分配&#xff09;&#xff0c;和永久修改&#xff08;设置静态ip&#xff09;。临时修改就是使用ifconfig命令直接修改&#xff0c;但是一段时间过后&#xff0c;或者重启又会动态重新分配。而永久修改则是直接将ip写在配置文件…

jenkins自动化部署

jenkins自动化部署 jenkins官网安装步骤 1. 安装环境 安装Java运行环境。Jenkins需要Java运行环境才能正常工作。您可以从Oracle官网下载Java运行环境并安装&#xff0c;或者使用您操作系统自带的Java运行环境。 sudo wget -O /etc/yum.repos.d/jenkins.repo \https://pkg.…

品牌在线上的困境

大家好&#xff01; 我是小鱼 目前&#xff0c;在我们国内 有很多品牌从传统的 门店转为线上经营 那是不是意味着 品牌公司要把自己 的实体门店都关了呢? 并不是那样的。 很多品牌实现了 线上门店和实体门店 相结合的方式来 改造升级的 那么他们是如何做到的呢&#xff1f; 对…

存储框架封装:LruCacheUtils+DiskLruCacheUtils+责任链设计模式+DeepLink

存储框架封装:LruCacheUtilsDiskLruCacheUtils责任链设计模式DeepLink 一.存储框架实现思路&#xff1f;1.缓存策略2.LRU算法3.LruCache内存缓存原理4.DiskLruCache磁盘缓存原理5.使用单例模式实现LRUCacheUtils5.使用单例模式实现DiskLRUCacheUtils 二.什么是责任链设计模式&a…

ASP.NET Core 使用Filter和Redis实现接口防重

背景 日常开发中&#xff0c;经常需要对一些响应不是很快的关键业务接口增加防重功能&#xff0c;即短时间内收到的多个相同的请求&#xff0c;只处理一个&#xff0c;其余不处理&#xff0c;避免产生脏数据。 这和幂等性&#xff08;idempotency&#xff09;稍微有点区别&am…

凌恩生物文献分享 | 16S全长扩增子+代谢组/转录组多组学!高分paper的绝佳拍档!

16S全长扩增子联合代谢组/转录组多组学研究&#xff0c;是目前微生态研究趋势。单一研究方法较难发表高水平文章&#xff0c;多组学关联研究逐渐成为“快速”发表高分paper的绝佳拍档&#xff01; 小编精心挑选了3篇医学微生态研究的高分文章&#xff0c;希望能帮助大家激发科…

二线程序员的出路

最近长沙不太平。去年被动离职一拨人之后&#xff0c;HR一直强调降本增效&#xff0c;人人自危&#xff0c;挤走一拨人&#xff0c;反正会有大量内卷失败的一线程序员进来填坑。当然留就有人走&#xff0c;前同事除了几个出去搞培训创业&#xff08;后面解散了&#xff09;的之…

chatgpt赋能Python-python_for_倒序

Python的倒序功能 - 从SEO角度分析 在Web开发中&#xff0c;搜索引擎优化&#xff08;SEO&#xff09;是一个关键的指标。如果你的网站能够被搜索引擎高效地索引&#xff0c;它就会排在搜索结果的前面&#xff0c;带来更多的流量和曝光率。Python&#xff0c;作为一种广泛应用…

【LED子系统】七、触发器实现

个人主页&#xff1a;董哥聊技术 我是董哥&#xff0c;高级嵌入式软件开发工程师&#xff0c;从事嵌入式Linux驱动开发和系统开发&#xff0c;曾就职于世界500强公司&#xff01; 创作理念&#xff1a;专注分享高质量嵌入式文章&#xff0c;让大家读有所得&#xff01; 文章目录…

探索未来:人工智能如何改变室内外设计

目录 注册&#xff1a; 使用RoomGPT进行室内和室外设计的步骤&#xff1a; 结果如下&#xff1a; RoomGPT是一款基于人工智能的设计工具&#xff0c;可以帮助专业人士和个人在几秒钟内生成照片般逼真的图像。以下是使用RoomGPT进行室内和室外设计的步骤&#xff1a; 注册&am…

聚观早报 | ChatGPT炒股回报率超500%;网易发布11新游戏

今日要闻&#xff1a;微信支付正式发布“微信刷掌”产品&#xff1b;ChatGPT炒股回报率超500%&#xff1b;网易发布11新游戏&#xff1b;国家超算中心发布中文大语言模型&#xff1b;B站试水付费专属视频 微信支付正式发布“微信刷掌”产品 5 月 21 日&#xff0c;北京轨道交通…

时序电路详解

1、什么是时序电路&#xff1f; 组合电路是根据当前输入信号的组合来决定输出电平的电路&#xff0c;换言之&#xff0c;就是现在的输出不会被过去的输入所左右&#xff0c;也可以说成是&#xff0c;过去的输入状态对现在的输出状态没有影响的电路。 时序电路和组合电路不同&…

「角」毫米波雷达前装增速放缓?哪些供应商位居TOP10

作为传统BSD&#xff08;盲区监测、并线辅助&#xff09;、DOW&#xff08;开门预警&#xff09;功能以及高阶智能驾驶的主要传感器之一&#xff0c;角&#xff08;盲区&#xff09;毫米波雷达在2022年实现了前装搭载的大幅增长。 高工智能汽车研究院监测数据显示&#xff0c;2…

Qt编写视频监控系统74-悬浮工具栏(半透明/上下左右位置/自定义按钮)

一、前言 在监控系统中一般在视频实时预览的时候&#xff0c;希望提供一个悬浮工具条&#xff0c;可以显示一些提示信息比如分辨率、码率、帧率&#xff0c;提供一堆快捷操作按钮&#xff0c;可以录像、抓拍、云台控制、关闭等操作&#xff0c;参考了国内很多监控厂商客户端软…

Spring Boot 整合 分布式搜索引擎 Elastic Search 实现 搜索、分页与结果过滤

文章目录 ⛄引言一、酒店搜索和分页⛅需求分析⚡源码编写 二、酒店结果过滤⌚需求分析⏰修改搜索业务 ✅效果图⛵小结 ⛄引言 本文参考黑马 分布式Elastic search Elasticsearch是一款非常强大的开源搜索引擎&#xff0c;具备非常多强大功能&#xff0c;可以帮助我们从海量数据…

【社群运营】AI智能对话,打造自动化社群

人工智能大背景下&#xff0c;各行各业都在往智能化发展&#xff0c;无论是办公产品&#xff0c;还是生产器械都选择接入了更加智能的AI来提高生产效率。那么&#xff0c;在日常的社群管理工作中&#xff0c;我们又能否跟上这一波热度&#xff0c;让社群自动化高效运营&#xf…

深度学习实战32-构建ChatT5模型,实现智能问答系统,类ChatGPT(CPU部署)

大家好,我是微学AI,今天给大家介绍一下深度学习实战32-构建ChatT5模型,实现智能问答系统,类ChatGPT(CPU部署),ChatT5使用了T5架构来处理输入文本,具有高度的并行性和扩展性,使其能够快速处理大规模数据集。与传统NLP模型不同,ChatT5采用端到端的方式进行训练,从而可以…

ov2640子设备核心操作详细分析

ov2640子设备核心操作详细分析 文章目录 ov2640子设备核心操作详细分析ov2640_subdev_core_ops核心操作获取寄存器值ov2640_g_register设置寄存器值ov2640_s_registeri2c_smbus_xferi2c_imx_xferi2c_smbus_xfer_emulatedi2c_transfer__i2c_transfer 设置ov2640的电源ov2640_s_p…