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
}
相关文章:
ES2021+新特性、常用函数
一、ES2021新特性 ES2021 数字分隔符 let num 1234567 let num2 1_234_567 Promise.any 与 Promise.all 类似,Promise.any 也接受一个 Promise 的数组。当其中任何一个 Promise 完成(fullfill)时,就返回那个已经有完成值的 …...

STM32——LCD
一、引脚配置 查看引脚 将上述引脚都设置为GPIO_Output 二、导入驱动文件 将 LCD 驱动的 Inc 以及 Src 中的 fonts.h,lcd.h 和 lcd.c 导入到自己工程的驱动文件中。 当然,后面 lcd 的驱动学习可以和 IMX6U 一块学。 三、LCD函数 void LCD_Clear(u16 Color); 功能…...

【redis进阶】分布式锁
目录 一、什么是分布式锁 二、分布式锁的基础实现 三、引入过期时间 四、引入校验 id 五、引入lua 六、引入 watch dog (看门狗) 七、引入 Redlock 算法 八、其他功能 redis学习🥳 一、什么是分布式锁 在一个分布式的系统中,也会涉及到多个节点访问同一…...

园区管理系统如何提升企业核心竞争力与资产管理智能化水平
内容概要 在当今快节奏的商业环境中,园区管理系统正成为企业的重要合作伙伴,尤其在工业园、产业园、物流园、写字楼和公寓等多种类型的物业管理中。这个系统不仅仅是一个管理工具,它还是提升企业运营效率和核心竞争力的关键因素。通过智能化…...
AI大模型开发原理篇-3:词向量和词嵌入
简介 词向量是用于表示单词意义的向量, 并且还可以被认为是单词的特征向量或表示。 将单词映射到实向量的技术称为词嵌入。在实际应用中,词向量和词嵌入这两个重要的NLP术语通常可以互换使用。它们都表示将词汇表中的单词映射到固定大小的连续向量空间中…...

高精度算法:高精度减法
P2142 高精度减法 - 洛谷 | 计算机科学教育新生态 我们两个整数一定要是大数减去小数,所以这个点我们需要特判一下,那我们两个字符串表示的整型怎么判断大小呢,我们字典序比较大小和真实的数字比较大小是一样的,比如我们的‘21’…...

Java创建项目准备工作
新建项目 新建空项目 每一个空项目创建好后都要检查jdk版本 检查SDK和语言级别——Apply——OK 检查当前项目的Maven路径,如果已经配置好全局,就是正确路径不用管 修改项目字符集编码,将所有编码都调整为UTF-8 创建Spingboot工程 创建Spring…...
基于STM32的智能宠物喂食器设计
目录 引言系统设计 硬件设计软件设计 系统功能模块 定时喂食模块远程控制与视频监控模块食物存量检测与报警模块语音互动与用户交互模块数据记录与智能分析模块 控制算法 定时与手动投喂算法食物存量检测与低存量提醒算法数据记录与远程反馈算法 代码实现 喂食控制代码存量检测…...

在线课堂小程序设计与实现(LW+源码+讲解)
专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...
为AI聊天工具添加一个知识系统 之77 详细设计之18 正则表达式 之5
本文要点 昨天讨论了 本项目(AI聊天工具添加一个知识系统)中正则表达式模板的设计中可能要考虑到的一些问题(讨论到的内容比较随意,暂时无法确定 那些考虑 是否 应该是正则表达式模板设计要考虑的以及 是否完整)。今天…...
【Elasticsearch】 索引模板 ignore_missing_component_templates
解释 ignore_missing_component_templates 配置 在Elasticsearch中,ignore_missing_component_templates 是一个配置选项,用于处理索引模板中引用的组件模板可能不存在的情况。当您创建一个索引模板时,可以指定一个或多个组件模板࿰…...
Github 2025-01-29 C开源项目日报 Top10
根据Github Trendings的统计,今日(2025-01-29统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量C项目10C++项目1Assembly项目1Go项目1我的电视 - 安卓电视直播软件 创建周期:40 天开发语言:CStar数量:649 个Fork数量:124 次关注人数:64…...

文件上传2
BUUCTF 你传你🐎呢 先上传.htaccess 修改格式 即可上传成功 返回上传图片格式的木马 用蚁剑连接 5ecf1cca-59a1-408b-b616-090edf124db5.node5.buuoj.cn:81/upload/7d8511a847edeacb5385299396a96d91/rao.jpg 即可得到flag [GXYCTF2019]BabyUpload...

Unity敌人逻辑笔记
写ai逻辑基本上都需要状态机。因为懒得手搓状态机,所以选择直接用动画状态机当逻辑状态机用。 架构设计 因为敌人的根节点已经有一个animator控制动画,只能增加一个子节点AI,给它加一个animator指向逻辑“动画”状态机。还有一个脚本&#…...

高级编码参数
1.跳帧机制 参考资料:frameskipping-hotedgevideo 跳帧机制用于优化视频质量和编码效率。它通过选择性地跳过某些帧并使用参考帧来预测和重建视频内容,从而减少编码所需的比特率,同时保持较高的视频质量。在视频编码过程中,如果…...

DeepSeek-R1:通过强化学习激励大型语言模型(LLMs)的推理能力
摘要 我们推出了第一代推理模型:DeepSeek-R1-Zero和DeepSeek-R1。DeepSeek-R1-Zero是一个未经监督微调(SFT)作为初步步骤,而是通过大规模强化学习(RL)训练的模型,展现出卓越的推理能力。通过强…...
leetcode——合并K个有序链表(java)
给你一个链表数组,每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中,返回合并后的链表。 示例 1: 输入:lists [[1,4,5],[1,3,4],[2,6]] 输出:[1,1,2,3,4,4,5,6] 解释:链表数组如下&#…...

【Valgrind】安装报错: 报错有未满足的依赖关系: libc6,libc6-dbg
Valgrind 内存泄漏检测工具安装 安装 sudo apt install valgrind官方上也是如此 但是在我的系统(debian12)上却失败了: 报错有未满足的依赖关系: libc6 : 破坏: valgrind (< 1:3.19.0-1~) 但是 1:3.16.1-1 正要被安装 libc6-dbg : 依赖…...
vue3和vue2的区别有哪些差异点
Vue3 vs Vue2 主要差异对比指南 官网 1. 核心架构差异 1.1 响应式系统 Vue2:使用 Object.defineProperty 实现响应式 // Vue2 响应式实现 Object.defineProperty(obj, key, {get() {// 依赖收集return value},set(newValue) {// 触发更新value newValue} })Vue3…...
论文笔记(六十三)Understanding Diffusion Models: A Unified Perspective(六)(完结)
Understanding Diffusion Models: A Unified Perspective(六)(完结) 文章概括指导(Guidance)分类器指导无分类器引导(Classifier-Free Guidance) 总结 文章概括 引用: …...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...

循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...

P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)
Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

短视频矩阵系统文案创作功能开发实践,定制化开发
在短视频行业迅猛发展的当下,企业和个人创作者为了扩大影响力、提升传播效果,纷纷采用短视频矩阵运营策略,同时管理多个平台、多个账号的内容发布。然而,频繁的文案创作需求让运营者疲于应对,如何高效产出高质量文案成…...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...

C++ 设计模式 《小明的奶茶加料风波》
👨🎓 模式名称:装饰器模式(Decorator Pattern) 👦 小明最近上线了校园奶茶配送功能,业务火爆,大家都在加料: 有的同学要加波霸 🟤,有的要加椰果…...
MinIO Docker 部署:仅开放一个端口
MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...
Caliper 配置文件解析:fisco-bcos.json
config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...