前端人必看!这 10 个 JavaScript 技巧,让你代码效率狂飙 99%!
haoteby 2025-05-08 00:57 4 浏览
前端开发的 “江湖” 里,JavaScript 就是咱们闯荡的 “绝世武功”。可不少兄弟天天对着代码抓耳挠腮,写得又慢又容易出 Bug,加班都成了家常便饭!别愁!今天带来的这 10 个 JavaScript 实战技巧,堪称 “效率神器”,不管你是刚入行的 “小白萌新”,还是经验丰富的 “前端大佬”,看完保准直呼过瘾,从此告别低效代码,在团队里脱颖而出!咱这文章还藏了超多当下最火的前端类热搜词,干货满满,跟着学就对了!
一、数组去重:一行代码解决重复数据 “大麻烦”
在实际开发中,从后端接口拿到的数据,经常会有重复项。要是直接用这些数据,业务逻辑准出岔子!以前用循环遍历去重,又麻烦又费时间。现在有了Set对象和扩展运算符,去重简直小菜一碟,这也是前端面试和开发的高频考点,学会它面试稳加分!
// 创建一个Set对象,Set集合有个超厉害的特性,存储的值都是唯一的,自动帮我们去掉重复元素
const uniqueSet = new Set([1, 2, 3, 2, 4, 3]);
// 用扩展运算符...把Set集合转换回数组,一行代码就实现了数组去重
const uniqueArray = [...uniqueSet];
console.log(uniqueArray); // 输出 [1, 2, 3, 4]
二、对象属性合并:告别手动赋值的 “笨办法”
当我们需要把多个对象的属性合并到一起时,手动一个一个赋值,不仅效率低,还特别容易写错。像合并用户基础信息和权限信息,用Object.assign()方法或者对象展开运算符,瞬间搞定!
// 定义用户基础信息对象
const userInfo = { name: '张三', age: 25 };
// 定义用户权限信息对象
const userPermission = { role: 'admin', permission: ['read', 'write'] };
// 使用Object.assign()方法,把userPermission合并到userInfo中,第一个参数是目标对象,这里传空对象避免修改原对象
const mergedInfo = Object.assign({}, userInfo, userPermission);
console.log(mergedInfo);
// 输出 { name: '张三', age: 25, role: 'admin', permission: ['read', 'write'] }
// ES2018后更常用的对象展开运算符,效果一样,代码更简洁
const newMergedInfo = {...userInfo,...userPermission };
console.log(newMergedInfo);
// 输出 { name: '张三', age: 25, role: 'admin', permission: ['read', 'write'] }
三、防抖节流:拯救页面卡顿的 “救命稻草”
在开发过程中,滚动页面、改变窗口大小、在搜索框输入内容,这些操作会频繁触发回调函数,导致页面卡顿,用户体验直线下降!别慌,防抖和节流就是解决这些问题的 “神器”!
防抖(Debounce)
防抖的原理就像等电梯,等一会儿没人来了再关门。在事件触发后,延迟一段时间再执行回调函数,如果这段时间内又触发了事件,就重新计时。特别适合搜索框搜索、按钮重复点击这些场景。
// 定义防抖函数,接收要执行的函数func和延迟时间delay
function debounce(func, delay) {
// 声明一个定时器变量timer
let timer;
// 返回一个新函数,这个函数就是我们实际使用的防抖函数
return function() {
const context = this;
const args = arguments;
// 清除之前设置的定时器,防止重复执行
clearTimeout(timer);
// 设置新的定时器,延迟delay时间后执行func函数
timer = setTimeout(() => {
func.apply(context, args);
}, delay);
};
}
// 获取搜索框元素
const searchInput = document.getElementById('search-input');
// 创建防抖后的搜索函数,延迟300毫秒执行搜索操作
const debouncedSearch = debounce(() => {
console.log('执行搜索操作');
}, 300);
// 给搜索框添加input事件监听器,触发防抖后的搜索函数
searchInput.addEventListener('input', debouncedSearch);
节流(Throttle)
节流就好比控制人流量,在规定时间内只允许通过一批人。它保证在一定时间间隔内,回调函数只能触发一次。滚动加载、鼠标拖拽这些场景用它再合适不过!
// 定义节流函数,接收要执行的函数func和时间间隔delay
function throttle(func, delay) {
// 声明一个定时器变量timer
let timer;
// 返回一个新函数,这个函数就是我们实际使用的节流函数
return function() {
const context = this;
const args = arguments;
// 如果timer为null,说明当前时间间隔内还没执行过函数
if (!timer) {
// 执行函数
func.apply(context, args);
// 设置定时器,delay时间后将timer设为null,允许下一次执行
timer = setTimeout(() => {
timer = null;
}, delay);
}
};
}
// 给窗口添加scroll事件监听器,触发节流后的滚动加载函数,时间间隔500毫秒
window.addEventListener('scroll', throttle(() => {
console.log('执行滚动加载操作');
}, 500));
四、链式调用:让代码 “丝滑” 到飞起
在操作对象或数组时,要是多次调用方法,代码会变得又长又难看。链式调用就像搭积木,能让我们在一行代码里连续调用多个方法,代码瞬间变得简洁优雅,可读性直接拉满!
const numbers = [1, 2, 3, 4, 5];
// 先使用map方法对数组进行映射,把每个元素乘以2
// 再用filter方法过滤出大于5的元素
// 最后用reduce方法对过滤后的元素求和
const result = numbers
.map(num => num * 2)
.filter(num => num > 5)
.reduce((acc, num) => acc + num, 0);
console.log(result); // 输出 18
五、可选链操作符:告别 “踩雷” 的非空判断
当我们访问对象的深层属性时,要是不检查属性是否为空,分分钟抛出TypeError错误,调试起来头都大了!可选链操作符?.就是救星,帮我们轻松搞定这个难题,它可是 ES2020 的重要新特性,前端开发热门知识点!
const user = { name: '李四' };
// 使用可选链操作符安全地访问深层属性,如果user.address为null或undefined,不会报错,直接返回undefined
const city = user.address?.city;
console.log(city); // 输出 undefined
六、Promise.all:并发请求,效率 “开挂”
有时候我们需要同时发起多个异步请求,比如获取用户信息、订单信息和商品信息,等所有请求都完成后再统一处理。这时候Promise.all就派上大用场了,合理用它,异步操作效率直接翻倍!
// 模拟获取用户信息的异步操作,1秒后返回用户信息
const getUserInfo = () => new Promise((resolve) => {
setTimeout(() => {
resolve({ name: '王五', age: 30 });
}, 1000);
});
// 模拟获取订单信息的异步操作,1.5秒后返回订单信息
const getOrderInfo = () => new Promise((resolve) => {
setTimeout(() => {
resolve({ orderId: 12345, amount: 100 });
}, 1500);
});
// 模拟获取商品信息的异步操作,2秒后返回商品信息
const getProductInfo = () => new Promise((resolve) => {
setTimeout(() => {
resolve({ productName: '手机', price: 5000 });
}, 2000);
});
// 使用Promise.all同时发起多个请求,所有请求成功后,在then回调中处理结果
Promise.all([getUserInfo(), getOrderInfo(), getProductInfo()])
.then(([user, order, product]) => {
console.log('用户信息:', user);
console.log('订单信息:', order);
console.log('商品信息:', product);
});
七、动态加载脚本:给页面加载速度 “瘦身”
开发过程中,有些脚本不需要在页面一开始就加载,像第三方统计脚本、广告脚本这些。如果一开始就加载,会拖慢页面速度。动态加载脚本就能解决这个问题,需要的时候再加载,页面加载速度直接起飞!
// 定义动态加载脚本函数,接收脚本的src路径
function loadScript(src) {
// 返回一个Promise对象
return new Promise((resolve, reject) => {
// 创建script标签
const script = document.createElement('script');
// 设置script标签的src属性
script.src = src;
// 脚本加载成功时执行resolve回调
script.onload = resolve;
// 脚本加载失败时执行reject回调
script.onerror = reject;
// 将script标签添加到页面的head中
document.head.appendChild(script);
});
}
// 动态加载jQuery脚本
loadScript('https://code.jquery.com/jquery-3.6.0.min.js')
.then(() => {
console.log('jQuery加载成功');
// 在这里可以使用jQuery进行后续操作
})
.catch((error) => {
console.error('jQuery加载失败:', error);
});
八、正则表达式:文本处理的 “万能钥匙”
正则表达式在处理文本匹配、替换、验证这些场景时,简直无敌!验证邮箱格式、手机号格式,提取字符串里的特定内容,都能轻松搞定。虽然学起来有点难,但学会了就是 “真香”!
验证邮箱格式
const email = 'example@example.com';
// 定义邮箱格式的正则表达式,匹配符合邮箱规则的字符串
const emailRegex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
// 使用test方法验证邮箱是否符合格式,返回true或false
const isValidEmail = emailRegex.test(email);
console.log(isValidEmail); // 输出 true
提取字符串中的数字
const text = '价格是199元';
// 定义提取数字的正则表达式,\d+表示匹配一个或多个数字,g表示全局匹配
const numberRegex = /\d+/g;
// 使用match方法提取字符串中符合正则表达式的数字,返回数组
const numbers = text.match(numberRegex);
console.log(numbers); // 输出 ['199']
九、ES6 解构赋值:数据提取 “快人一步”
从对象或数组里获取特定数据,用传统方法又麻烦又啰嗦。ES6 的解构赋值就像 “数据提取神器”,简单又高效,还能设置默认值,处理数据超方便!
数组解构
// 从数组[1, 2, 3]中依次提取元素赋值给a、b、c
const [a, b, c] = [1, 2, 3];
console.log(a); // 输出 1
console.log(b); // 输出 2
console.log(c); // 输出 3
对象解构
const user = { name: '赵六', age: 28, address: '北京' };
// 从user对象中提取name和age属性赋值给同名变量
const { name, age } = user;
console.log(name); // 输出 赵六
console.log(age); // 输出 28
// 解构赋值设置默认值,如果user对象中没有city属性,city变量就等于默认值'上海'
const { city = '上海' } = user;
console.log(city); // 输出 上海
十、函数柯里化:让函数 “灵活百变”
函数柯里化能把一个多参数函数变成多个单参数函数,让函数变得超级灵活,在复杂业务逻辑和函数组合场景中,简直是 “代码复用神器”!
// 普通的加法函数,接收两个参数并返回它们的和
function add(a, b) {
return a + b;
}
// 柯里化后的加法函数,先接收一个参数a,返回一个新函数,新函数再接收参数b并返回和
function curriedAdd(a) {
return function(b) {
return a + b;
};
}
// 创建一个固定加5的函数
const add5 = curriedAdd(5);
console.log(add5(3)); // 输出 8
这 10 个 JavaScript 实战技巧,涵盖了前端开发的多个场景,从数据处理到性能优化,从代码简洁性到灵活性,每一个都超实用!赶紧在项目里试试,体验效率飙升的快感!要是你还有其他 JavaScript 技巧想了解,或者对某个知识点有疑问,欢迎在评论区留言,咱们一起交流,共同进步!
相关推荐
- 网站seo该怎么优化
-
一、网站定位在建设一个网站之前,我们首先要做的就是一个网站清晰的定位,会带来转化率相对较高的客户群体,我们建站的目的就是为了营销,只有集中来做某一件事,才会更好的展现我们的网站。在做SEO优化的同时...
- 3个小技巧教你如何做好SEO优化
-
想半路出家做SEO?可是,怎么才做的好呢?关于SEO专业技术弄懂搜索引擎原理,咱们做搜索引擎排名的首先就是要了解搜索引擎的工作原理,对SEO优化有更深入了解之后再来做SEO,你就能从搜索引擎的视点...
- SEO指令分享:filetype指令
-
filetype用于搜索特定的文件格式。百度和谷歌都支持filetype指令。比如搜索filetype:pdf今日头条返回的就是包含今日头条这个关键词的所有pdf文件,如下图:百度只支持:pdf...
- 网站seo优化技巧大全
-
SEO在搜索引擎中对检索结果进行排序,看谁最初是在用户的第一眼中看到的。实际上,这些排名都是通过引擎的内部算法来实现的。例如,百度算法很有名。那么,对百度SEO的优化有哪些小技巧?下面小编就会说下针对...
- 小技巧#10 某些高级的搜索技巧
-
由于某些原因,我的实验场所仅限百度。1.关键词+空格严格说来这个不能算高级,但关键词之间打空格的办法确实好用。我习惯用右手大拇指外侧敲击空格键,这个习惯在打英文报告时尤其频繁。2.site:(请不要忽...
- MYSQL数据库权限与安全
-
权限与安全数据库的权限和数据库的安全是息息相关的,不当的权限设置可能会导致各种各样的安全隐患,操作系统的某些设置也会对MySQL的安全造成影响。1、权限系统的工作原理...
- WPF样式
-
UniformGrid容器<UniformGridColumns="3"Rows="3"><Button/>...
- MySQL学到什么程度?才有可以在简历上写精通
-
前言如今互联网行业用的最多就是MySQL,然而对于高级Web面试者,尤其对于寻找30k下工作的求职者,很多MySQL相关知识点基本都会涉及,如果面试中,你的相关知识答的模糊和不切要点,基...
- jquery的事件名称和命名空间的方法
-
我们先看一些代码:当然,我们也可以用bind进行事件绑定。我们看到上面的代码,我们可以在事件后面,以点号,加我们的名字,就是事件命名空间。所谓事件命名空间,就是事件类型后面以点语法附加一个别名,以便引...
- c#,委托与事件,发布订阅模型,观察者模式
-
什么是事件?事件(Event)基本上说是一个用户操作,如按键、点击、鼠标移动等等,或者是一些提示信息,如系统生成的通知。应用程序需要在事件发生时响应事件。通过委托使用事件事件在类中声明且生成,且通过...
- 前端分享-原生Popover已经支持
-
传统网页弹窗开发需要自己处理z-index层级冲突、编写点击外部关闭的逻辑、管理多个弹窗的堆叠顺序。核心优势对比:...
- Axure 8.0 综合帖——新增细节内容
-
一、钢笔工具与PS或者AI中的钢笔工具一样的用法。同样有手柄和锚点,如果终点和起点没有接合在一起,只要双击鼠标左键即可完成绘画。画出来的是矢量图,可以理解为新的元件。不建议通过这个工具来画ICON图等...
- PostgreSQL技术内幕28:触发器实现原理
-
0.简介在PostgreSQL(简称PG)数据库中,触发器(Trigger)能够在特定的数据库数据变化事件(如插入、更新、删除等)或数据库事件(DDL)发生时自动执行预定义的操作。触发器的实现原理涉及...
- UWP开发入门(十七)--判断设备类型及响应VirtualKey
-
蜀黍我做的工作跟IM软件有关,UWP同时会跑在电脑和手机上。电脑和手机的使用习惯不尽一致,通常我倾向于根据窗口尺寸来进行布局的变化,但是特定的操作习惯是依赖于设备类型,而不是屏幕尺寸的,比如聊天窗口的...