ES2021+新特性、常用函数

一、ES2021+新特性

ES2021

数字分隔符
 let num = 1234567 let num2 = 1_234_567
Promise.any
与 Promise.all 类似,Promise.any 也接受一个 Promise 的数组。当其中任何一个 Promise 完成(fullfill)时,就返回那个已经有完成值的 Promise。
如果所有的 Promise 都拒绝(reject),则返回一个拒绝的 Promise,该 Promise 的返回值是一个 AggregateError 对象。我们可以把 Promise.any 理解成 Promise.all 的相反操作。Promise.any(promises).then((first) => {// 任何一个 Promise 完成了},(error) => {// 所有的 Promise 都拒绝了});
逻辑符号简写
a ||= b;// 等同于 a = a || b  如果 a 为真则返回 a,如果 a 为假则返回 b
c &&= d;// 等同于 c = c && d  如果 a 为真,则返回 b , 如果 a 为假,则返回 a
e ??= f;// 等同于 e = e ?? f  如果 e 为 null或未定义,则返回 f;如果e为真,则返回e。

ES2022

类的构造新写法
旧:	class Car {constructor() {this.color = 'blue';this.age = 2;}}
新:	class Car {color = 'blue';age = 2;#firstName = 'Joseph';        // 私有变量 使用in来判断某个对象是否拥有某个私有属性hasColor() {return #firstName in this;   //console.log(car.hasColor()); // true}}
顶层await
 //旧:function timeout(ms) {return new Promise((resolve) => {setTimeout(resolve, ms);});}async function asyncPrint(value, ms) {await timeout(ms);console.log(value);}asyncPrint('hello world', 50);//新:function setTimeoutAsync(timeout) {return new Promise((resolve) => {setTimeout(() => {resolve();}, timeout);})}await setTimeoutAsync(3000);
字符串、数组的at()方法
//数组const arr = ['a', 'b', 'c', 'd'];
// 倒数第一个元素console.log(arr.at(-1)); // dconsole.log(arr.at(-2)); // c
//字符串const str = 'Coding Beauty';console.log(str.at(-1)); // yconsole.log(str.at(-2)); // t
//TypedArray对象const typedArray = new Uint8Array([16, 32, 48, 64]);console.log(typedArray.at(-1)); // 64console.log(typedArray.at(-2)); // 48
正则表达式匹配字符串的时候支持返回开始和结束索引
const str = 'sun and moon';const regex = /and/d;                   //给正则表达式添加一个d的标记;返回匹配到的子字符串的起始位置还返回其结束位置const matchObj = regex.exec(str);
/**
['and',index: 4,input: 'sun and moon',groups: undefined,indices: [ [ 4, 7 ], groups: undefined ]
]*/console.log(matchObj);
Object.hasOwn()方法,检查某个对象自身是否拥有某个属性
const obj = Object.create(null);
obj.color = 'green';
obj.age = 2;
obj.hasOwnProperty = () => false;console.log(Object.hasOwn(obj, 'color')); // true
console.log(Object.hasOwn(obj, 'name'));  // false  基本等价于obj.hasOwnProperty('name')
数组支持逆序查找findLast()和findLastIndex()
const nums = [7, 14, 3, 8, 10, 9];const lastEven = nums.findLast((num) => num % 2 === 0);
const lastEvenIndex = nums.findLastIndex((num) => num % 2 === 0);console.log(lastEven); // 10
console.log(lastEvenIndex); // 4

ES2023

数组的新方法
Array.prototype.toReversed()                                // 该方法返回一个新数组,新数组的元素顺序与原数组相反。
Array.prototype.toSorted(compareFn)                         // 该方法返回一个新数组,新数组的元素是原数组元素的排序结果。
Array.prototype.toSpliced(start, deleteCount, ...items)     // 该方法返回一个新数组,新数组删除了原数组从指定位置开始的指定数量的元素。
Array.prototype.with(index, value)                          // 该方法返回一个新数组,新数组在指定索引位置的元素被替换为指定值。
Array.prototype.findLast()                                  // 从数组中获取匹配元素的最后一个实例,如果找不到匹配元素,则返回 undefined。
Hashbang 语法
#!/usr/bin/env node
// in the Script Goal
'use strict';
console.log(2*3);#!/usr/bin/env node
// in the Module Goal
export {};
console.log(2*2);
Symbol 作为 WeakMap 的键
在这之前,WeakMap仅允许对象作为键值,新特性更容易创建和共享key。var map = new WeakMap(); // 创建一个弱映射
function useSymbol(symbol){doSomethingWith(symbol);var called = map.get(symbol) || 0上面的例子允许从外部调用者调用计数器,并在不再有引用时释放映射条目。
代码本身无法知道何时不再需要引用,如果使用普通的 Map,将会导致内存泄漏。
这是因为即使在调用它的客户端不再需要引用时,代码仍然会保留对该引用的持有。
在这种情况下使用 WeakMap,可以确保垃圾回收在不再存在对键符号的引用时删除映射条目。

ES2024

Promise.withResolvers()
// Promise.withResolvers() 允许创建一个新的 Promise,并同时获得 resolve 和 reject 函数。// old
let resolve, reject;  
const promise = new Promise((res, rej) => {  resolve = res;  reject = rej;  
});// new 
const { promise, resolve, reject } = Promise.withResolvers();  // 在这里可以使用 resolve 和 reject 函数  
setTimeout(() => resolve('成功!'), 8000);  promise.then(value => {  console.log(value); // 输出: 成功!  
});
数组分组

Object.groupBy()

// Object.groupBy返回一个普通对象
const fruits = [{ name: "Apple", color: "red" },{ name: "Banana", color: "yellow" },{ name: "Cherry", color: "red" },{ name: "Lemon", color: "yellow" },{ name: "Grape", color: "purple" },
];const fruitsByColor = Object.groupBy(fruits, (fruit) => fruit.color)
// 注意,使用Object.groupBy方法返回一个没有原型(即没有继承任何属性和方法)的对象。这意味着该对象不会继承Object.prototype上的任何属性或方法。

Map.groupBy()

// Map.groupBy返回一个 Map 对象
const fruits = [{ name: "Apple", color: "red" },{ name: "Banana", color: "yellow" },{ name: "Cherry", color: "red" },{ name: "Lemon", color: "yellow" },{ name: "Grape", color: "purple" },
];const fruitsByColor = Map.groupBy(fruits, (fruit) => fruits.color); // 返回map对象

二、常用函数部分

1、自定义一个缓存函数
// Map.groupBy返回一个 Map 对象
const fruits = [{ name: "Apple", color: "red" },{ name: "Banana", color: "yellow" },{ name: "Cherry", color: "red" },{ name: "Lemon", color: "yellow" },{ name: "Grape", color: "purple" },
];const fruitsByColor = Map.groupBy(fruits, (fruit) => fruits.color); // 返回map对象
2、检查对象是否为空
即使对象为空,每次检查对象是否等于 {} 也会返回 false。
const isEmpty = obj => Reflect.ownKeys(obj).length === 0 && obj.constructor === Object
3、检查设备上的触摸支持
const touchSupported = () => ('ontouchstart' in window || DocumentTouch && document instanceof DocumentTouch)
4、重定向到另一个 URL
const redirect = url => location.href = url
5、检测某个元素是否聚焦
const hasFocus = el => el === document.activeElement
6、获取所有 cookie 并转为对象
const getCookies = () => document.cookie.split(';').map(item => item.split('=')).reduce((acc, [k, v]) => (acc[k.trim().replace('"', '')] =v) && acc, {})
7、清除所有 cookie
const clearCookies = () => document.cookie.split(';').forEach(c => document.cookie = c.splace(/^+/, '').replace(/=.*/,`=;expires=${new Date().toUTCString()};path=/`)))
8、从对象中删除值为 null 和 undefined 的属性
const removeNullAndUndefined = (obj) => Object.entries(obj).reduce((a, [k, v]) => (v == null ? a : ((a[k] = v), a)), {});
9、js下载图片
const imgUrl = "";// 图片链接const a = document.createElement('a');// 这里是将url转成blob地址,fetch(imgUrl)  // 跨域时会报错.then(res => res.blob()).then(blob => { // 将链接地址字符内容转变成blob地址a.href = URL.createObjectURL(blob);a.download ='追溯二维码.jpg'; // 下载文件的名字document.body.appendChild(a);a.click();//在资源下载完成后 清除 占用的缓存资源window.URL.revokeObjectURL(a.href);document.body.removeChild(a);})
10、瀑布流布局
const waterFall = () => {//瀑布流核心代码let img = $(".img-item");//获取图片集合let imgWidth = $(".img-item").width();//当前图片宽度let boxWidth = $(".img-box").width();//瀑布流布局框宽度let cols = parseInt(boxWidth / imgWidth);//求出列数let heightArr = [];//创建高度数组,用于存储各行当前高度// 遍历图片集合$.each(img, function (index, item) {let imgHeight = $(item).height();//取出对应图片的高度if (index < cols) {//判断是不是第一行,第一行索引0~cols-1,//第一行直接存入高度数组heightArr[index] = imgHeight;} else {//非第一行操作,将此次图片定位到高度最低的一列//获取高度数组中的最小值,即所有列中最小的一列,是此次图片定位的起始高度,即toplet minBoxHeight = Math.min(...heightArr);//获取最小高度对应的列索引,$.inArray()用于查找对应数组中指定值的索引。(未匹配成功的话,返回-1)//从而可以判断出此次图片定位的起始leftlet minBoxIndex = $.inArray(minBoxHeight, heightArr)//图片定位插入对应位置$(item).css({position: 'absolute',//加10是因为css设置了右外边距left: minBoxIndex * (imgWidth + 10) + 'px',//加6是为了让间距相同,视觉舒适top: minBoxHeight + 6 + 'px'})//高度追加,存入高度数组heightArr[minBoxIndex] += imgHeight + 6;}})//获取每次执行完的最大高度,用于设置瀑布流盒子高度//因为瀑布流图片设置绝对定位而使,盒子高度塌陷//最后执行完就是整个瀑布流盒子的高度let maxBoxHeight = Math.max(...heightArr);$(".img-box").css("height", maxBoxHeight);
}
11、分散节点转树
// 子节点遍历成树
export function formatToTree(array: Array<any>, pid?: any) {return array.filter((item) =>// 如果没有父id(第一次递归的时候)将所有父级查询出来// 这里认为 item.parentId === 0 顶层 idpid === undefined ? item.parentId === 0 : item.parentId === pid).map((item) => {// 通过父节点ID查询所有子节点item.children = formatToTree(array, item.id);return item;});
}
12、统计一个对象中所有的数据类型
function countDataTypes(obj) {const types = {};function getType(value) {if (Array.isArray(value)) {return "array";} else if (value instanceof Date) {return "date";} else if (value === null) {return "null";} else {return typeof value;}}function countTypes(obj) {for (const key in obj) {if (obj.hasOwnProperty(key)) {const type = getType(obj[key]);if (types[type]) {types[type]++;} else {types[type] = 1;}if (type === "object") {countTypes(obj[key]);}}}}countTypes(obj);return types;
}// 测试用例:
const obj = {name: "John",age: 30,hobbies: ["reading", "coding"],address: {street: "123 Main St.",city: "Anytown",state: "CA"},favoriteColor: null,birthDate: new Date()
};// 结果
{string: 1,number: 1,array: 1,object: 2,boolean: 0,undefined: 0,function: 0,symbol: 0,bigint: 0,null: 1,date: 1
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++中的类与对象(中)

在上一节中&#xff0c;我们初步了解了一下&#xff0c;C中的类&#xff0c;这一概念&#xff0c;这一节让我们进一步深入了解一下。 文章目录 目录 前言 一、类中的默认成员函数 1.1 构造函数 构造函数的特点&#xff1a; 1.2 析构函数 析构函数的特点&#xff1a; 1.3 …

机器人抓取与操作概述(深蓝)——1

工业机器人&#xff1a;① “臂”的形态 ② “手”的形态 ③ 视觉&#xff0c;力和触觉 1 机器人的不同形态 “臂”的形态 “手”的形态 2 常见的操作任务 操作&#xff1a;插入、推和滑 抓取&#xff1a;两指&#xff08;平行夹爪&#xff09;抓取、灵巧手抓取 落地-产…

指针的介绍3后

1.函数指针变量 1.1函数的地址 void test(int (*arr)[2]) {printf("zl_dfq\n"); } int main() {printf("%p\n", test);printf("%p\n", &test);return 0; } 由上面的程序运行可知&#xff1a; 函数名就是函数的地址 &函数名也可以拿到函…

基于Springboot的智能学习平台系统【附源码】

基于Springboot的智能学习平台系统 效果如下&#xff1a; 系统登陆页面 系统主页面 课程详情页面 论坛页面 考试页面 试卷管理页面 考试记录页面 错题本页面 研究背景 随着互联网技术的普及&#xff0c;人们探索知识的方式逐渐转向数字化平台。传统的教学方法通常局限于固定…

shiro学习五:使用springboot整合shiro。在前面学习四的基础上,增加shiro的缓存机制,源码讲解:认证缓存、授权缓存。

文章目录 前言1. 直接上代码最后在讲解1.1 新增的pom依赖1.2 RedisCache.java1.3 RedisCacheManager.java1.4 jwt的三个类1.5 ShiroConfig.java新增Bean 2. 源码讲解。2.1 shiro 缓存的代码流程。2.2 缓存流程2.2.1 认证和授权简述2.2.2 AuthenticatingRealm.getAuthentication…

网关登录校验

网关登录校验 单体架构时我们只需要完成一次用户登录、身份校验&#xff0c;就可以在所有业务中获取到用户信息。而微服务拆分后&#xff0c;每个微服务都独立部署&#xff0c;不再共享数据。也就意味着每个微服务都需要做登录校验&#xff0c;这显然不可取。 鉴权思路分析 …

【单细胞第二节:单细胞示例数据分析-GSE218208】

GSE218208 1.创建Seurat对象 #untar(“GSE218208_RAW.tar”) rm(list ls()) a data.table::fread("GSM6736629_10x-PBMC-1_ds0.1974_CountMatrix.tsv.gz",data.table F) a[1:4,1:4] library(tidyverse) a$alias:gene str_split(a$alias:gene,":",si…

【已解决】黑马点评项目Redis版本替换过程的数据迁移

黑马点评项目Redis版本替换过程的数据迁移 【哭哭哭】附近商户中需要用到的GEO功能只在Redis 6.2以上版本生效 如果用的是老版本&#xff0c;美食/KTV的主页能正常返回&#xff0c;但无法显示内容 上次好不容易升到了5.0以上版本&#xff0c;现在又用不了了 Redis 6.2的windo…

本地部署deepseek模型步骤

文章目录 0.deepseek简介1.安装ollama软件2.配置合适的deepseek模型3.安装chatbox可视化 0.deepseek简介 DeepSeek 是一家专注于人工智能技术研发的公司&#xff0c;致力于打造高性能、低成本的 AI 模型&#xff0c;其目标是让 AI 技术更加普惠&#xff0c;让更多人能够用上强…

[论文总结] 深度学习在农业领域应用论文笔记14

当下&#xff0c;深度学习在农业领域的研究热度持续攀升&#xff0c;相关论文发表量呈现出迅猛增长的态势。但繁荣背后&#xff0c;质量却不尽人意。相当一部分论文内容空洞无物&#xff0c;缺乏能够落地转化的实际价值&#xff0c;“凑数” 的痕迹十分明显。在农业信息化领域的…

快速分析LabVIEW主要特征进行判断

在LabVIEW中&#xff0c;快速分析程序特征进行判断是提升开发效率和减少调试时间的重要技巧。本文将介绍如何高效地识别和分析程序的关键特征&#xff0c;从而帮助开发者在编写和优化程序时做出及时的判断&#xff0c;避免不必要的错误。 ​ 数据流和并行性分析 LabVIEW的图形…

展示统计信息收集情况

看看最近是否收集失败 SET LINES 200 PAGES 0 SET LONG 100000 longc 100000 COLUMN REPORT FORMAT A200VARIABLE stat_report CLOB; BEGIN:stat_report : DBMS_STATS.REPORT_STATS_OPERATIONS (since > SYSDATE-3 , until > SYSDATE , detail_lev…

STM32 TIM输入捕获 测量频率

输入捕获简介&#xff1a; IC&#xff08;Input Capture&#xff09;输入捕获 输入捕获模式下&#xff0c;当通道输入引脚出现指定电平跳变时&#xff0c;当前CNT的值将被锁存到CCR中&#xff0c;可用于测量PWM波形的频率、占空比、脉冲间隔、电平持续时间等参数 每个高级定时器…

如何将 Windows 上的文件传递到 Mac 上

文章目录 效果需求Windows 上设置共享磁盘【可选】新建一个带有密码的账户查看 Windows 的 IP 地址Mac 上链接 Windows 共享的磁盘 效果 需求 Windows 上有一个有密码的账户 Windows 上设置共享磁盘 windows 这边需要用 Administrator 权限的账号&#xff0c;把要共享的磁盘设…

NLP模型大对比:Transformer > RNN > n-gram

结论 Transformer 大于 RNN 大于 传统的n-gram n-gram VS Transformer 我们可以用一个 图书馆查询 的类比来解释它们的差异&#xff1a; 一、核心差异对比 维度n-gram 模型Transformer工作方式固定窗口的"近视观察员"全局关联的"侦探"依赖距离只能看前…

ODP(OBProxy)路由初探

OBProxy路由策略 Primary Zone 路由 官方声明默认情况&#xff0c;会将租户请求发送到租户的 primary zone 所在的机器上&#xff0c;通过 Primary Zone 路由可以尽量发往主副本&#xff0c;方便快速寻找 Leader 副本。另外&#xff0c;设置primary zone 也会在一定成都上减少…

Python NumPy(7):连接数组、分割数组、数组元素的添加与删除

1 连接数组 函数描述concatenate连接沿现有轴的数组序列stack沿着新的轴加入一系列数组。hstack水平堆叠序列中的数组&#xff08;列方向&#xff09;vstack竖直堆叠序列中的数组&#xff08;行方向&#xff09; 1.1 numpy.concatenate numpy.concatenate 函数用于沿指定轴连…

在线课堂小程序设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

生成模型:扩散模型(DDPM, DDIM, 条件生成)

扩散模型的理论较为复杂&#xff0c;论文公式与开源代码都难以理解。现有的教程大多侧重推导公式。为此&#xff0c;本文通过精简代码&#xff08;约300行&#xff09;&#xff0c;从代码运行角度讲解扩散模型。 本文包括扩散模型的3项技术复现&#xff1a; 1.DDPM (Denoising…

DeepSeek大模型技术解析:从架构到应用的全面探索

一、引言 在人工智能领域&#xff0c;大模型的发展日新月异&#xff0c;其中DeepSeek大模型凭借其卓越的性能和广泛的应用场景&#xff0c;迅速成为业界的焦点。本文旨在深入剖析DeepSeek大模型的技术细节&#xff0c;从架构到应用进行全面探索&#xff0c;以期为读者提供一个…