前端高级开发需要知道的 25 个 JavaScript 单行代码

  1. 不使用临时变量来交换变量的值
    例如我们想要将 a 于 b 的值交换
let a = 1, b = 2;
// 交换值
[a, b] = [b, a];// 结果: a = 2, b = 1

这行代码使用数组解构赋值的方式来交换两个变量的值,无需定义新的临时变量。这个巧妙的技巧可让代码看起来更简洁明了。语法[a, b] = [b, a]通过解构右侧的数组并将其分配给左侧来实现交换它们的值。

  1. 对象解构,让数据访问更便捷
const { name, age } = { name: '张三', age: 23 };// 结果: name = '张三', age = 23

这里使用对象解构赋值的方式将对象中的属性直接提取到新的变量中。这种方法简化了访问对象属性的过程,并增强了代码的可读性。

  1. 浅克隆对象
const originalObj = { name: '张三', age: 24 };const clonedObj = { ...originalObj };// 结果: clonedObj = { name: '张三', age: 24 }
// 此时改变 clonedObj 的属性,将不会影响到原始对象 originalObj

通过使用扩展运算符 ( …) 创建originalObj的浅克隆对象。此技术将所有可枚举的自身属性从原始对象复制到新对象。

  1. 合并对象
const obj1 = { name: '张三' };
const obj2 = { age: 22 };const mergedObj = { ...obj1, ...obj2 };// 结果: mergedObj = { name: '张三', age: 22 }

与克隆类似,通过扩展运算符将obj1和合并obj2为一个新的对象。如果有重叠的属性,则最后一个对象的属性将覆盖前一个对象的属性。

  1. 清理数组
const arr = [ 0, 1, false, 2, '', 3 ];const cleanedArray = arr.filter(Boolean);// 结果: cleanedArray = [1, 2, 3]

通过Array.prototype.filter()函数并使用Boolean函数作为回调。它将会从数组中删除所有假值( 0,false,null,undefined,‘’,NaN)。

  1. 将 NodeList 转换为数组
const nodesArray = [ ...document.querySelectorAll('div') ];

通过扩展运算符将NodeList( document.querySelectorAll函数的返回值) 转换为 JavaScript 数组,从而能够使用数组的map方法filter去操作查找到的元素。

  1. 检查数组是否满足指定条件
    例如我们要判断一个数组中是否存在负数
const arr = [ 1, 2, 3, -5, 4 ];// 数组中是否有负数
const hasNegativeNumbers = arr.some(num => num < 0);// 结果: hasNegativeNumbers = true

Array.prototype.some()函数用于检查数组中是否至少有一个元素,通过所提供的回调函数实现的测试(此处判断是否是负数,返回true表示通过)

另外,还可以使用Array.prototype.every()来检查数组的所有元素是否全部通过测试(此处判断是否是正数)

const arr = [ 1, 2, 3, -5, 4 ];// 数组元素是否全部为正
const allPositive = arr.every(num => num > 0);// 结果: allPositive = false
  1. 将文本复制到剪贴板
navigator.clipboard.writeText('Text to copy');

通过使用 Clipboard API 以编程方式将文本复制到剪贴板。这是一种最新的复制方法,可让文本复制变得无缝且高效(但目前各大浏览器支持度还不是很高,需要考虑兼容性问题)。

  1. 删除数组重复项
const arr = [1, 2, 2, 3, 4, 4, 5];const unique = [...new Set(arr)];// 结果: unique = [1, 2, 3, 4, 5]

这里利用了Set对象存储的值会保持唯一,以及扩展运算符能将Set转换回数组的特性。这是一种优雅的删除数组中重复项的方式。

  1. 取两个数组的交集
const arr1 = [1, 2, 3, 4];
const arr2 = [2, 4, 6, 8];// 取两个数组中公共的元素
const intersection = arr1.filter(value => arr2.includes(value));// 结果: intersection = [2, 4]

此示例通过使用Array.prototype.filter()函数去查找arr1与arr2中的公共元素。传入的回调函数会检查arr2是否包含arr1的每一个元素,从而得到两个数组的交集。

  1. 求数组元素的总和
const arr = [1, 2, 3, 4];// 求总和
const sum = arr.reduce((total, value) => total + value, 0);// 结果: sum = 10

此示例使用Array.prototype.reduce()方法将数组中所有的值全部累加起来。reduce方法接收一个回调函数和一个初始值(即前一个回调函数累加值的初始值),这个回调函数有两个参数:累加值total和当前值value。它将会遍历数组所有元素,将每个元素添加到总和中(总和初始为0)。

  1. 根据指定条件判断,是否给对象的属性赋值
const condition = true;
const value = '你好,世界';// 如果条件为真,则将 value 变量的值赋给 newObject.key 属性
const newObject = {...(condition && {key: value})};// 结果: newObject = { key: '你好,世界' }

此案例使用扩展运算符 (…) 与短路求值(&&),将属性有条件地添加到对象中。 如果condition为真,则会将{key: value}扩展到对象中;否则不进行任何操作。

  1. 使用变量作为对象的键
const dynamicKey = 'name';
const value = '张三';// 使用一个动态的变量作为 key
const obj = {[dynamicKey]: value};// 结果: obj = { name: '张三' }

这种语法称为计算属性名,它允许使用变量作为对象的键。方括号内的dynamicKey表达式会计算其值,以将其用作属性名称。

  1. 离线状态检查器
const isOnline = navigator.onLine ? '在线' : '离线';// 结果: isOnline = '在线' 或 '离线'

这段代码使用三元运算符检查浏览器的在线状态(navigator.onLine),如果为真则返回’在线’,否则返回’离线’。这是一种动态检查用户网络连接状态的方法。

  1. 离开页面弹出确认对话框
window.onbeforeunload = () => '你确定要离开吗?';

这行代码与window的onbeforeunload事件挂钩,当用户离开页面时会弹出一个确认对话框,一般用于防止用户因未保存更改就关闭页面而导致数据丢失。

  1. 对象数组,根据对象的某个key求对应值的总和
const arrayOfObjects = [{x: 1}, {x: 2}, {x: 3}];// 指定要求和的 key值
const sumBy = (arr, key) => arr.reduce((acc, obj) => acc + obj[key], 0);// 传入 'x',求元素对象 key 为 'x' 的值的总和
sumBy(arrayOfObjects, 'x'));// 结果: 6

sumBy函数使用Array.prototype.reduce()对数组中元素特定键的值求和。这是一种根据给定键计算对象数组总和的灵活方法。

  1. 将 url 问号后面的查询字符串转为对象
const query = 'name=John&age=30';// 将字符串解析为对象
const parseQuery = query => Object.fromEntries(new URLSearchParams(query));// 结果: parseQuery = { name: 'John', age: '30' }

此示例将一个查询字符串转换为了一个对象。其中URLSearchParams会进行字符串解析,它将返回一个可迭代对象,然后在通过Object.fromEntries将它转换为对象,从而使 URL 参数检索变得方便多了。

  1. 将秒数转换为时间格式的字符串
const seconds = 3661; // 一小时是 3600 秒,多出 61 秒const toTimeString = seconds => new Date(seconds * 1000).toISOString().substr(11, 8);toTimeString(seconds));// 结果: '01:01:01'

此示例将秒数转换为 HH:MM:SS 格式的字符串。它通过给定的秒数加上时间戳起始点来创建一个新的 Date 对象,然后将其转换为 ISO 字符串,并提取时间部分得到结果。

  1. 求某对象所有属性值的最大值
// 数学、语文、英语成绩
const scores = { math: 95, chinese: 99, english: 88 };const maxObjectValue = obj => Math.max(...Object.values(obj));// 最高分
maxObjectValue(scores));// 结果: 99

此示例用于在对象所有的属性值中找到最大值。其中Object.values(obj)将对象所有的属性值提取为数组,然后使用展开运算符将数组的所有元素作为Math.max函数的参数进行最大值查找。

  1. 判断对象的值中是否包含有某个值
const person = { name: '张三', age: 30 };const hasValue = (obj, value) => Object.values(obj).includes(value);hasValue(person, 30);// 结果: true

hasValue函数会检查对象的值中是否存在指定的值。其中Object.values(obj)用于获取对象中所有的值的数组,然后通过includes(value)检查指定值是否在该数组中。

  1. 安全访问深度嵌套的对象属性
const user = { profile: { name: '张三' } };const userName = user.profile?.name ?? '匿名';// 结果: userName = '张三'

此代码首先演示了如何使用可选链运算符 (?.) 安全地访问user.profile的name值。如果user.profile是undefined或null,它会短路并返回undefined,从而避免潜在的类型错误TypeError。

然后,使用空值合并运算符 (??) 检查左侧是否为null或undefined,如果是,则使用默认值’匿名’。这可确保后备值不会是其他假值(如’'或0)。这对于访问数据结构中可能不存在某些中间属性的深层嵌套属性非常有用。

在 JavaScript 中,空值合并运算符 (??) 和逻辑或 (||) 都可以用于提供默认值,但它们处理假值的方式有所不同。

在上面的例子中,如果把??改为||,行为会稍微有些不同。||的左侧如果为假值,它将会返回右侧的值。JavaScript 中的假值包括null、undefined、0、NaN、‘’(空字符串)和false。这意味着||左边的值不仅仅是null或undefined,如果还是其他假值,那么都将返回右侧的值。

  1. 条件执行语句
const isEligible = true;isEligible && performAction();// 如果 isEligible 为真,则调用 performAction()

利用逻辑 AND ( &&) 运算符,函数performAction()仅会在isEligible结果为true时执行。这是一种无需if语句即可有条件地执行函数的简介语法。这对于根据某些条件执行函数非常有用,尤其是在事件处理或回调中。

如果想要条件赋值,则可以这样写

const isEligible = true;
let value = '';// 需要将赋值语句用用括号括起来
isEligible && (value = '条件达成');// 如果 isEligible 为真,则执行 (value = '条件达成') 语句
  1. 创建包含值为指定数字范围的数组
    例如创建数字5以内所有正数的数组
const range = Array.from({ length: 5 }, (_, i) => i + 1);// 结果: range = [1, 2, 3, 4, 5]

Array.from()从类数组或可迭代对象创建一个新数组。这里,它接受一个具有属性length和映射函数的对象。映射函数 ( (_, i) => i + 1) 使用索引 ( i) 生成从 1 到 5 的数字。下划线 ( _) 是一种惯例,表示未使用该参数。

  1. 提取文件扩展名
const fileName = 'example.png';const getFileExtension = str => str.slice(((str.lastIndexOf(".") - 1) >>> 0) + 2);// 结果: getFileExtension = 'png'

这个案例实现了从字符串中提取文件扩展名。它先找到最后一次出现点号 (.) 位置,然后截取从该位置到末尾的字符串。位运算符 (>>>) 确保了即使未找到点号 (.) ,操作也是安全的,因为在这种情况下仍然会返回一个空字符串。

  1. 切换元素的 class
const element = document.querySelector('.my-element');const toggleClass = (el, className) => el.classList.toggle(className);toggleClass(element, 'active');

toggleClass函数使用classList.toggle()方法从一个元素的 class 列表中添加或移除某个 class。如果该 class 存在,则删除,否则添加。这是一种根据用户交互或应用程序状态动态更新 class 的方法。非常适合实现响应式设计元素,例如菜单根据用户操作显示或隐藏。

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

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

相关文章

如何新建CANoe工程

本文将从启动CANoe软件开始&#xff0c;一步步引导您完成新工程的创建与基本配置&#xff0c;确保您的仿真测试工作能够顺利进行。 启动CANoe软件&#xff1a;打开CANoe软件&#xff0c;进入主界面。 新建工程&#xff1a;点击菜单栏的 File --> New --> CAN FD&#x…

Facebook群控策略详解

Facebook群控早在前几年就很火爆了&#xff0c;对于做Facebook营销或者电商的跨境选手来说&#xff0c;这是个不错的提高效率扩大增长的办法。具体来说&#xff0c;Facebook群控是一种通过同时管理多个Facebook账户进行自动化推广活动的方法&#xff0c;它可以实现自动发布帖子…

通讯概念-全双工、串行、同步等

1.单工&#xff0c;半双工&#xff0c;双工概念 2.串行和并行&#xff1a; 并行多根数据总线同时传输&#xff0c;需要考虑波特率情况&#xff0c;串行波特率可以很大&#xff0c;不需要考虑传输总线限制 3.同步和异步概念&#xff1a; 同步需要时钟同步&#xff0c;发送和接收…

经济下行,电商人效通过小程序快速实现多端引流

中国经济下行周期&#xff0c;消费者趋向于理性消费&#xff0c;更注重产品的实用性和性价比。中端商品的需求减少&#xff0c;低端消费人群的消费能力下降&#xff0c;导致“消费降级”现象明显。 许多线下实体店以及传统电商&#xff0c;仅仅依靠现在的模式&#xff0c;很难…

Fish Agent:集成 ASR 和 TTS 的端到端语音处理模型,支持多语言转换

❤️ 如果你也关注大模型与 AI 的发展现状&#xff0c;且对大模型应用开发非常感兴趣&#xff0c;我会快速跟你分享最新的感兴趣的 AI 应用和热点信息&#xff0c;也会不定期分享自己的想法和开源实例&#xff0c;欢迎关注我哦&#xff01; &#x1f966; 微信公众号&#xff…

软件测试工程师面试整理 —— 编程与自动化!

在软件测试领域&#xff0c;编程与自动化是提升测试效率、覆盖率和可靠性的关键因素。掌握编程技术和自动化测试框架&#xff0c;能够帮助测试人员有效地执行大量重复性测试任务&#xff0c;并迅速反馈软件的质量状况。以下是编程与自动化在测试中的主要应用及相关技术介绍&…

04字符串算法/代码随想录

四、字符串 反转字符串 力扣344 遇到数组双指针真是太好用了&#xff0c;左右指针不断逼近即可&#xff0c;代码也很简单 class Solution {public void reverseString(char[] s) {int fast s.length - 1;int slow 0;while (slow < fast) {char temp s[fast];s[fast] s[…

Unreal5从入门到精通之如何使用C++实现一个剧情系统

前言 说到剧情系统,大家可能会说,UE的关卡序列Sequencer,做剧情不是很方便吗?没错,Sequencer确实方便,而且它可以让你为场景中的角色,物体等创建精确的动画,并使用关键帧来控制他们的运动和状态变化。 它还可以做相机的移动,剪辑,音效,特效等故事情节,相机特效,多…

袋鼠云产品功能更新报告12期|让数据资产管理更高效

本期&#xff0c;我们更新和优化了数据资产平台相关功能&#xff0c;为您提供更高效的产品能力。以下为第12期袋鼠云产品功能更新报告&#xff0c;请继续阅读。 一、【元数据】重点更新 &#xff5c;01 元数据管理优化&#xff0c;支持配置表生命周期 之前系统中缺少一个可以…

将多个commit合并成一个commit并提交

0 Preface/foreword 1 压缩多个commit方法 1.1 git merge --squash 主分支&#xff1a;main 开发分支&#xff1a;test 当前在test分支提交了8个commits&#xff0c;功能已经开发完成&#xff0c;需要将test分支合并到main分支&#xff0c;但是不想在合并时候&#xff0c;看…

大数据新视界 -- 大数据大厂之提升 Impala 查询效率:重写查询语句的黄金法则(下)(4/30)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

我想让AI帮我生成一点不正经的东西……

前言 最近突发奇想&#xff1a;为啥我一定要不断得翻找各种壁纸呢&#xff1f;为啥就不能让AI给我生成一张专属的壁纸&#xff0c;上面有我喜欢的内容&#xff0c;这样&#xff0c;我这张壁纸就是独一无二的了&#xff01; 说干就干&#xff0c;小白默默打开了AI工具…… 点我…

17、电话号码的字母组合-cangjie

题目 17、电话号码的字母组合 思路 输入处理&#xff1a; 接收一个字符串 digits&#xff0c;表示手机键盘上的数字&#xff0c;数字可以对应不同的字母组合。 边界检查&#xff1a; 如果输入字符串 digits 为空&#xff0c;返回一个空的结果列表。 按钮映射&#xff1a; 初…

ZYNQ: AXI DMA 环路测试

环境 vivado 2022 vitis 2022 简介 DMA&#xff0c;即Direct Memory Access&#xff0c;指直接存储器访问。这是一种内存访问技术&#xff0c;允许某些计算机内部的硬件子系统&#xff08;如计算机外设&#xff09;独立地直接读写系统内存&#xff0c;而无需中央处理器&…

动态规划 01背包(算法)

现有四个物品&#xff0c;小偷的背包容量为8&#xff0c;怎么可以偷得价值较多的物品 如: 物品编号&#xff1a; 1 2 3 4 物品容量&#xff1a; 2 3 4 5 物品价值&#xff1a; 3 4 5 8 记f(k,w) ,当背包容量为w,可以偷k件物品…

端到端自动驾驶模型SparseDrive论文阅读笔记

为了进一步的理解模型&#xff0c;方便对模型进行调试&#xff0c;对论文进行了详细的阅读&#xff0c;记录了相关的笔记&#xff0c;和论文阅读批注。 论文阅读批注连接&#xff1a; https://note.youdao.com/s/VC6mDgdZ 笔记如下图&#xff1a;

SAP ABAP开发学习——BAPI

目录 业务对象 概念 ​编辑业务对象浏览 BAPI BAPI的浏览 BAPI的调用 BAPI的确认和返回 BAPI的创建 MM/SD常用BAPI 附加&#xff1a;长文本修改 业务对象 概念 业务对象浏览 进入SWO3查看 双击BUS2012 双击下图上方红色位置可以看到BAPI方法的内容 BAPI BAPI(Busines…

【网络】自定义协议——序列化和反序列化

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;了解什么是序列化和分序列&#xff0c;并且自己能手撕网络版的计算器。 > 毒鸡汤&#xff1a;有些事情&#xff0c;总是不明白&#xff0c;所以我不…

linux 原子操作

首先是为什么要有 原子操作 网上的截图&#xff1a; 不能从C语言来看&#xff0c;要从汇编来看 但是实际的情况有可能是这样。 A进程没有得到想要的结果。 然后是 原子操作的 底层实现 最终会是这段代码&#xff0c;当然只是一个 加一的操作。 static inline void atomic_a…

[MySQL]DQL语句(二)

(一)里面我们以单表查询为基础&#xff0c;讲了DQL语句的基础&#xff0c;这篇我们来讲多表查询。 联合查询 联合查询的作用是合并结果集&#xff0c;也就是把两个select语句的查询结果合并到一起。合并结果集的方式有两种&#xff0c;分别是去重和不去重。语法格式为: SELEC…