高级前端开发需要知道的 25 个 JavaScript 单行代码
1. 不使用临时变量来交换变量的值
例如我们想要将 a
于 b
的值交换
let a = 1, b = 2;
// 交换值
[a, b] = [b, a];
// 结果: a = 2, b = 1
这行代码使用数组解构赋值的方式来交换两个变量的值,无需定义新的临时变量。这个巧妙的技巧可让代码看起来更简洁明了。语法[a, b] = [b, a]
通过解构右侧的数组并将其分配给左侧来实现交换它们的值。
2. 对象解构,让数据访问更便捷
const { name, age } = { name: '张三', age: 23 };
// 结果: name = '张三', age = 23
这里使用对象解构赋值的方式将对象中的属性直接提取到新的变量中。这种方法简化了访问对象属性的过程,并增强了代码的可读性。
3. 浅克隆对象
const originalObj = { name: '张三', age: 24 };
const clonedObj = { ...originalObj };
// 结果: clonedObj = { name: '张三', age: 24 }
// 此时改变 clonedObj 的属性,将不会影响到原始对象 originalObj
通过使用扩展运算符 ( ...
) 创建originalObj
的浅克隆对象。此技术将所有可枚举的自身属性从原始对象复制到新对象。
4. 合并对象
const obj1 = { name: '张三' };
const obj2 = { age: 22 };
const mergedObj = { ...obj1, ...obj2 };
// 结果: mergedObj = { name: '张三', age: 22 }
与克隆类似,通过扩展运算符将obj1
和合并obj2
为一个新的对象。如果有重叠的属性,则最后一个对象的属性将覆盖前一个对象的属性。
5. 清理数组
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
)。
6. 将 NodeList 转换为数组
const nodesArray = [ ...document.querySelectorAll('div') ];
通过扩展运算符将NodeList
( document.querySelectorAll
函数的返回值) 转换为 JavaScript 数组,从而能够使用数组的map
方法filter
去操作查找到的元素。
7. 检查数组是否满足指定条件
例如我们要判断一个数组中是否存在负数
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
8. 将文本复制到剪贴板
navigator.clipboard.writeText('Text to copy');
通过使用 Clipboard API 以编程方式将文本复制到剪贴板。这是一种最新的复制方法,可让文本复制变得无缝且高效(但目前各大浏览器支持度还不是很高,需要考虑兼容性问题)。
9. 删除数组重复项
const arr = [1, 2, 2, 3, 4, 4, 5];
const unique = [...new Set(arr)];
// 结果: unique = [1, 2, 3, 4, 5]
这里利用了Set
对象存储的值会保持唯一,以及扩展运算符能将Set
转换回数组的特性。这是一种优雅的删除数组中重复项的方式。
10. 取两个数组的交集
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
的每一个元素,从而得到两个数组的交集。
可以在这在线运行上述演示代码
11. 求数组元素的总和
const arr = [1, 2, 3, 4];
// 求总和
const sum = arr.reduce((total, value) => total + value, 0);
// 结果: sum = 10
此示例使用Array.prototype.reduce()
方法将数组中所有的值全部累加起来。reduce
方法接收一个回调函数和一个初始值(即前一个回调函数累加值的初始值),这个回调函数有两个参数:累加值total
和当前值value
。它将会遍历数组所有元素,将每个元素添加到总和中(总和初始为0)。
12. 根据指定条件判断,是否给对象的属性赋值
const condition = true;
const value = '你好,世界';
// 如果条件为真,则将 value 变量的值赋给 newObject.key 属性
const newObject = {...(condition && {key: value})};
// 结果: newObject = { key: '你好,世界' }
此案例使用扩展运算符 (...
) 与短路求值(&&
),将属性有条件地添加到对象中。 如果condition
为真,则会将{key: value}
扩展到对象中;否则不进行任何操作。
13. 使用变量作为对象的键
const dynamicKey = 'name';
const value = '张三';
// 使用一个动态的变量作为 key
const obj = {[dynamicKey]: value};
// 结果: obj = { name: '张三' }
这种语法称为计算属性名,它允许使用变量作为对象的键。方括号内的dynamicKey
表达式会计算其值,以将其用作属性名称。
14. 离线状态检查器
const isOnline = navigator.onLine ? '在线' : '离线';
// 结果: isOnline = '在线' 或 '离线'
这段代码使用三元运算符检查浏览器的在线状态(navigator.onLine
),如果为真则返回'在线'
,否则返回'离线'
。这是一种动态检查用户网络连接状态的方法。
15. 离开页面弹出确认对话框
window.onbeforeunload = () => '你确定要离开吗?';
这行代码与window
的onbeforeunload
事件挂钩,当用户离开页面时会弹出一个确认对话框,一般用于防止用户因未保存更改就关闭页面而导致数据丢失。
16. 对象数组,根据对象的某个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()
对数组中元素特定键的值求和。这是一种根据给定键计算对象数组总和的灵活方法。
17. 将 url 问号后面的查询字符串转为对象
const query = 'name=John&age=30';
// 将字符串解析为对象
const parseQuery = query => Object.fromEntries(new URLSearchParams(query));
// 结果: parseQuery = { name: 'John', age: '30' }
此示例将一个查询字符串转换为了一个对象。其中URLSearchParams
会进行字符串解析,它将返回一个可迭代对象,然后在通过Object.fromEntries
将它转换为对象,从而使 URL 参数检索变得方便多了。
18. 将秒数转换为时间格式的字符串
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 字符串,并提取时间部分得到结果。
19. 求某对象所有属性值的最大值
// 数学、语文、英语成绩
const scores = { math: 95, chinese: 99, english: 88 };
const maxObjectValue = obj => Math.max(...Object.values(obj));
// 最高分
maxObjectValue(scores));
// 结果: 99
此示例用于在对象所有的属性值中找到最大值。其中Object.values(obj)
将对象所有的属性值提取为数组,然后使用展开运算符将数组的所有元素作为Math.max
函数的参数进行最大值查找。
20. 判断对象的值中是否包含有某个值
const person = { name: '张三', age: 30 };
const hasValue = (obj, value) => Object.values(obj).includes(value);
hasValue(person, 30);
// 结果: true
hasValue
函数会检查对象的值中是否存在指定的值。其中Object.values(obj)
用于获取对象中所有的值的数组,然后通过includes(value)
检查指定值是否在该数组中。
21. 安全访问深度嵌套的对象属性
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
,如果还是其他假值,那么都将返回右侧的值。
22. 条件执行语句
const isEligible = true;
isEligible && performAction();
// 如果 isEligible 为真,则调用 performAction()
利用逻辑 AND ( &&
) 运算符,函数performAction()
仅会在isEligible
结果为true
时执行。这是一种无需if
语句即可有条件地执行函数的简介语法。这对于根据某些条件执行函数非常有用,尤其是在事件处理或回调中。
如果想要条件赋值,则可以这样写
const isEligible = true;
let value = '';
// 需要将赋值语句用用括号括起来
isEligible && (value = '条件达成');
// 如果 isEligible 为真,则执行 (value = '条件达成') 语句
23. 创建包含值为指定数字范围的数组
例如创建数字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 的数字。下划线 ( _
) 是一种惯例,表示未使用该参数。
24. 提取文件扩展名
const fileName = 'example.png';
const getFileExtension = str => str.slice(((str.lastIndexOf(".") - 1) >>> 0) + 2);
// 结果: getFileExtension = 'png'
这个案例实现了从字符串中提取文件扩展名。它先找到最后一次出现点号 (.
) 位置,然后截取从该位置到末尾的字符串。位运算符 (>>>
) 确保了即使未找到点号 (.
) ,操作也是安全的,因为在这种情况下仍然会返回一个空字符串。
25. 切换元素的 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 的方法。非常适合实现响应式设计元素,例如菜单根据用户操作显示或隐藏。
以上 25 个 JavaScript 单行代码,以简短高效的方式提供强大的功能。希望您今天能有所收获!
在线运行上述演示代码
高级前端开发需要知道的 25 个 JavaScript 单行代码的更多相关文章
- 你应该知道的 50 个 Python 单行代码
你应该知道的 50 个 Python 单行代码 1. 字母移位词:猜字母的个数和频次是否相同 2. 二进制转十进制 3. 转换成小写字母 4. 转换成大写字母 5. 字符串转换为字节类型 6. 复制文 ...
- 你应该知道的25道Javascript面试题
题目来自 25 Essential JavaScript Interview Questions.闲来无事,正好切一下. 一 What is a potential pitfall with usin ...
- 你有必要知道的 25 个 JavaScript 面试题
1.使用 typeof bar === "object" 推断 bar 是不是一个对象有神马潜在的弊端?怎样避免这样的弊端? 使用 typeof 的弊端是显而易见的(这样的弊端同使 ...
- JS高级前端开发群加群说明及如何晋级
JS高级前端开发群加群说明 一.文章背景: 二. 高级群: 三. 加入方式: 四. 说明: 一.文章背景: 去年年初建了几个群,在不经意间火了,一直排在“前端开发”关键字搜索结果第一名.当然取得这 ...
- 前端进阶试题css(来自js高级前端开发---豪情)既然被发现了HOHO,那我就置顶了嘿嘿!觉得自己技术OK的可以把这套题目做完哦,然后加入高级前端的社区咯
http://www.cnblogs.com/jikey/p/4426105.html js高级前端开发加群方法(此群很难进,里面纯技术,严禁广告,水群) 完整题目做完发邮箱(jikeytang@16 ...
- 前端开发必须知道的JS(二) 闭包及应用
http://www.cnblogs.com/ljchow/archive/2010/07/06/1768749.html 在前端开发必须知道的JS(一) 原型和继承一文中说过下面写篇闭包,加之最近越 ...
- 前端开发必须知道的JS之闭包及应用
本文讲的是函数闭包,不涉及对象闭包(如用with实现).如果你觉得我说的有偏差,欢迎拍砖,欢迎指教. 在前端开发必须知道的JS之原型和继承一文中说过下面写篇闭包,加之最近越来越发现需要加强我的闭包应用 ...
- JS高级前端开发群加群说明
JS高级前端开发群加群说明 *一.文章背景: *二. 高级群: *三. 加入方式: *四. 说明: 一.文章背景: 去年年初建了几个群,在不经意间火了,一直排在"前端开发"关键字搜 ...
- Web前端开发最佳实践(9):CSS代码太太乱,重复代码太多?你需要精简CSS代码
前言 提高网站整体加载速度的一个重要手段就是提高代码文件的网络传输速度.之前提到过,所有的代码文件都应该是经过压缩了的,这可提高网络传输速度,提高性能.除了压缩代码之外,精简代码也是一种减小代码文件大 ...
- Front End Developer Questions 前端开发人员问题(三)JavaScript部分
问题来源:http://markyun.github.io/2015/Front-end-Developer-Questions/ 三.javascript1.介绍JavaScript的基本数据类型. ...
随机推荐
- 【视频特辑】提效神器!如何用Quick BI高效配置员工的用数权限
简介:随着企业数字化进程逐步加速,企业所产生和积累的数据资源日益增多.每当员工的用数权限发生变动,管理员都需要进行复杂繁琐的重复性配置流程,不仅耗时耗力还容易出错. 如何能便捷地对员工用数权限进行高 ...
- 聚焦 | 数据湖分析如何面向对象存储OSS进行优化?
简介: 最佳实践,以DLA为例子.DLA致力于帮助客户构建低成本.简单易用.弹性的数据平台,比传统Hadoop至少节约50%的成本.其中DLA Meta支持云上15+种数据数据源(OSS.HDFS.D ...
- [GPT] nodejs 什么情况下可以使用 import 来引入 export 的模块
在 Node.js 中,原生并不支持 ES6 的 import 语句来引入模块. 不过从 Node.js v12 开始,通过实验性功能(--experimental-modules)可以使用 .mjs ...
- dotnet 读 WPF 源代码 聊聊 DispatcherTimer 的实现
本文来告诉大家在 WPF 框架里面,是如何实现 DispatcherTimer 的功能.有小伙伴告诉我,读源代码系列的博客看不动,原因是太底层了.我尝试换一个方式切入逻辑,通过提问题和解决问题的方法, ...
- 让.NET 8 支持 Windows Vista RTM
众所周知,从 Windows 的每次更新又会新增大量 API,这使得兼容不同版本的 Windows 需要花费很大精力.导致现在大量开源项目已经不再兼容一些早期的 Windows 版本,比如 .NET ...
- linux打包压缩工具详解
linux打包压缩工具详解 目录 linux打包压缩工具详解 1.linux文件压缩工具 1.1 compress命令详解 1.2 gzip命令详解 1.3 bzip2命令详解 1.4 xz命令详解 ...
- 如何提高WordPress的加载速度
针对wordpress加载速度慢的原因: 1. 由于Wordpress系统默认使用谷歌字体,在国内谷歌域名被屏蔽,所以导致操作反应慢.对于很多商业主题默认使用了谷歌字体.谷歌ajax库.谷歌地图等谷歌 ...
- Oracle中ALTER TABLE的五种用法(一)
首发微信公众号:SQL数据库运维 原文链接:https://mp.weixin.qq.com/s?__biz=MzI1NTQyNzg3MQ==&mid=2247485212&idx=1 ...
- three.js 物体要使用光线投射技术,计算是否点击位置与物体有交叉
原生 DOM 还用原生的 DOM 点击事件,要注意开启 pointerEvents CSS3DRenderer 是一个新的渲染器,需要在渲染循环调用并适配 labelRenderer.domEleme ...
- smtplib详解,发送邮件
创建邮箱账号 1.官网登录邮箱. 2.在邮箱的主界面找到"设置",新版的主界面与旧版稍有不同,一般位于上方,齿轮状的即是. 3.点击齿轮状的设置标志,会弹出一个下拉菜单,在最后有我 ...