前端必看!12个JS神级简写技巧,代码效率直接飙升80%,告别加班!

作者:刘大华日期:2025/10/8

前言

哈喽大家好,我是大华。

在日常开发中,我们经常会遇到一些重复、冗长的代码。写起来费劲,读起来费神,维护起来更是头疼。而且代码越复杂,性能可能越受影响。

那有没有办法让代码更简洁、清晰又高效呢?

JavaScript提供了许多现代语法特性,合理使用这些简写技巧,不仅能大幅减少代码量,还能提升可读性和执行效率。

很多资深前端都在用,这篇文章整理了 12 个最实用的 JS 简写技巧,并结合实际场景进行优化和补充,帮助你写出更优雅的代码。


1. 短路运算符:替代简单的 if 判断

以前我们这样写条件判断:

1if (isReady) {
2    startApp();
3}
4

现在可以用逻辑与(&&)的短路特性简化为一行:

1isReady && startApp();
2

适用场景:当 isReady 为真值时才执行函数。

注意:仅适用于简单条件,避免滥用导致可读性下降。


2. 空值合并运算符(??):精准设置默认值

传统做法是用 || 设置默认值:

1let name = username || '默认用户';
2

但问题来了:如果 username0''false,也会被替换成默认值 —— 这通常不是我们想要的。

推荐使用空值合并运算符:

1let name = username ?? '默认用户';
2

只有当 usernamenullundefined 时才会使用默认值,其他“假值”如 0'' 都会被保留。

最佳实践:处理 API 返回数据或配置项时特别有用。


3. 可选链操作符(?.):安全访问深层属性

想获取一个嵌套对象的属性:

1user.address.street.name;
2

但如果 useraddress 不存在,就会抛出错误。

过去需要层层判断:

1const streetName = user && user.address && user.address.street && user.address.street.name;
2

现在只需:

1const streetName = user?.address?.street?.name;
2

如果任意一层为 null/undefined,返回 undefined 而不会报错。

支持方法调用:obj.method?.() 和数组索引:arr?.[index]


4. 模板字符串:字符串拼接

老式拼接方式容易出错且难看:

1let message = 'Hello, ' + name + '! 你的余额是 ' + balance + ' 元。';
2

用模板字符串(反引号)清爽多了:

1let message = `Hello, ${name}! 你的余额是 ${balance} 元。`;
2

优势:

  • 支持换行
  • 内嵌表达式 ${}
  • 更易维护

5. 解构赋值:快速提取数据

从对象或数组中取值,再也不用手动赋值了。

对象解构:

1// 旧写法
2let name = user.name;
3let age = user.age;
4
5// 新写法
6let { name, age } = user;
7

还可以重命名、设默认值:

1let { name: userName, age = 18 } = user;
2

数组解构:

1let [first, second] = list;
2let [, , third] = list; // 跳过前两个元素
3

常用于函数参数解构、React 中的状态提取等。


6. 箭头函数:更简洁的函数定义

传统函数:

1function multiply(a, b) {
2    return a * b;
3}
4

箭头函数一行搞定:

1const multiply = (a, b) => a * b;
2

优点:

  • 语法简洁
  • 不绑定自己的this,适合事件回调、.map() 等场景

注意:不要在对象方法或需要动态this的地方使用(比如 DOM 事件监听器),否则this指向会出问题。


7. 扩展运算符(...):轻松合并与复制

合并数组:

1// 旧:concat()
2let combined = array1.concat(array2);
3
4// 新:扩展运算符
5let combined = [...array1, ...array2];
6

插入元素也方便:

1let newArr = [...array1, newItem, ...array2];
2

合并对象:

1let config = { ...defaultConfig, ...userConfig };
2

注意:扩展运算符是浅拷贝!嵌套对象仍共享引用。


8. 数组高阶函数:替代 for 循环

遍历查找元素,过去常用 for 循环:

1let found;
2for (let i = 0; i < users.length; i++) {
3    if (users[i].id === targetId) {
4        found = users[i];
5        break;
6    }
7}
8

现在一行解决:

1let found = users.find(user => user.id === targetId);
2

常用方法推荐:

方法用途
.find()查找第一个匹配项
.filter()过滤出所有符合条件的项
.map()映射新数组
.some() / .every()判断是否存在 / 是否全部满足条件
.includes()判断是否包含某值

示例:

1// 获取所有活跃用户的名字
2const activeNames = users
3  .filter(u => u.isActive)
4  .map(u => u.name);
5

9. 对象属性简写:变量名即属性名

当变量名与属性名一致时,无需重复书写:

1let name = '小明';
2let age = 25;
3
4// 旧写法
5let user = {
6    name: name,
7    age: age
8};
9
10// 新写法
11let user = {
12    name,
13    age
14};
15

特别适合构建 API 请求体、返回对象等场景。


10. 指数运算符(**):更直观的幂运算

以前计算幂要用 Math.pow()

1let result = Math.pow(2, 8); // 256
2

现在直接用 **

1let result = 2 ** 8; // 256
2

更接近数学表达习惯,支持负指数:

1let half = 2 ** -1; // 0.5
2

11. 逻辑赋值运算符:结合条件与赋值

ES2021 引入了三个逻辑赋值运算符,能进一步简化赋值逻辑。

场景一:只在为空时赋值

1// 旧写法
2if (user.role === null || user.role === undefined) {
3    user.role = 'guest';
4}
5
6// 新写法
7user.role ??= 'guest'; // 等价于 user.role = user.role ?? 'guest';
8

场景二:只有当前值为真才更新

1user.isAdmin &&= false; // 若 isAdmin 为真,则设为 false
2

场景三:拼接字符串或累加

1message += welcomeText; // 原生已有
2
3// 也可以用
4message ||= 'default'; // 如果 message 是假值,则赋默认值
5

小结:

运算符含义
??=空值合并赋值
&&=逻辑与赋值
|=

12. Nullish Coalescing 结合 Optional Chaining

?.?? 结合使用,可以构建极其健壮的数据访问逻辑。

例如:

1const displayName = user?.profile?.name ?? '匿名用户';
2

解释:

  • 先通过可选链安全访问 name
  • 如果结果是 nullundefined,则返回默认值

应用于表单默认值、UI 渲染 fallback 等非常合适。


总结

技巧关键字/符号
1. 短路运算&&, |
2. 空值合并??
3. 可选链?.
4. 模板字符串`${}`
5. 解构赋值{}, []
6. 箭头函数=>
7. 扩展运算符...
8. 数组方法.find(), .map() 等
9. 属性简写{ name }
10. 指数运算符**
11. 逻辑赋值??=, &&=, |
12. 组合技巧?. + ??

它们的好处

  • 减少代码量
  • 提升可读性(适度使用)
  • 增强健壮性(如 ?.??
  • 更贴近现代 JS 编码规范

但也请注意

  • 不要为了使用而过度简化
  • 团队协作中确保成员都熟悉这些语法
  • 在关键路径上优先保证可读性和可调试性

如果你觉得这篇文章对你有帮助,欢迎点赞、收藏、转发!

公众号:程序员刘大华,专注分享前后端开发的实战笔记。关注我,少走弯路,一起进步!

📌往期精彩

《Java8 都出这么多年了,Optional 还是没人用?到底卡在哪了?》

《90%的人不知道!Spring官方早已不推荐@Autowired?这3种注入方式你用对了吗?》

《别再写 TypeScript enum了!新枚举方式让 bundle 瞬间小20%》

《Vue3 的 ref 和 reactive 到底用哪个?90% 的开发者都选错了》


前端必看!12个JS神级简写技巧,代码效率直接飙升80%,告别加班!》 是转载文章,点击查看原文


相关推荐


【玩泰山派】4、制作ubuntu镜像-(5)总结制作ubuntu22.04镜像+5.10内核流程
风为你而吹2025/10/7

文章目录 前言rk镜像概念rk镜像构成生成sd卡镜像 制作根文件系统流程概述文件概述执行流程执行./mk-base-debian.sh执行mk-buster-rootfs.sh执行./mk-image.sh 总结 使用docker容器基于鲁班猫的仓库制作泰山派的ubuntu22.04根文件系统前言流程制作docker镜像启动docker容器进入容器进入容器后执行step1.准备step2.构建基础 Ubuntu 系统。step3.添加 rk overlay 层,并打包ubuntu


DrissionPage爬取汽车之家:(车名 + 颜色 + 车辆型号/续航里程)
python全栈蛇行者2025/10/5

DrissionPage爬取汽车之家 效果展示 项目概述与背景 在当今大数据时代,网络数据采集已成为获取信息的重要手段。本教程将全面详细介绍如何使用Python的DrissionPage库结合其他工具爬取汽车之家网站(https://www.autohome.com.cn/price/levelid_1)的汽车数据。汽车之家作为国内领先的汽车资讯平台,包含了丰富的汽车信息数据,这些数据对于汽车市场分析、竞品研究、价格监控等具有重要价值。 本项目旨在通过自动化技术手段,高效地采集汽


UNIX下C语言编程与实践5-C 语言编译器 cc(gcc/xlc)核心参数解析:-I、-L、-D 的使用场景与实例
迎風吹頭髮2025/10/4

一、引言:为什么需要关注 cc 编译器参数? 在 UNIX 环境下,C 语言编译器(如 gcc、xlc,统一简称 cc)是开发的核心工具。当项目规模超过单个文件、依赖第三方库或需要条件编译时,仅靠默认编译命令(如 cc main.c -o main)会频繁遇到「头文件找不到」「库链接失败」「宏定义未生效」等问题。 本文聚焦 cc 编译器中最核心的三个参数:-I(加载头文件路径)、-L(加载库文件路径)、-D(宏定义),结合实际项目案例解析其作用、使用场景及常见问题,同时拓展其他实用参数,帮助


介绍一种新的向量存储格式:DiskBBQ
Elastic 中国社区官方博客2025/10/3

作者:来自 Elastic Benjamin Trent, John Wagster 及 Ignacio Vera Sequeiros 介绍 DiskBBQ,一种 HNSW 的替代方案,并探讨何时以及为何使用它。 测试 Elastic 的领先开箱即用能力。深入我们的示例笔记本,开始免费的云试用,或立即在本地机器上尝试 Elastic。 DiskBBQ 是 Inverted Vector File (IVF) 索引的进化版。它是 Hierarchical Navigable Sm


vue2到vue3快速上手入门
cz橙2025/10/2

vue3 需要会vue2,该文档笔记基于黑马的课,进阶快速入门vue3 vue3 官方文档:https://v3.cn.vuejs.org/ main.js改变 import { createApp } from 'vue' import App from './App.vue' const app = createApp(App) app.mount('#app') /* 挂载app到id为app的元素上 */ 不需要new Vue(),直接createApp(App) App.


Mock数据与真实API的无缝切换:联调阶段的核心技术
_5792025/10/2

在现代软件开发中,尤其是在多系统、多平台的应用环境下,如何高效地进行数据集成和接口联调一直是一个挑战。随着开发流程的不断优化,Mock数据和真实API的无缝切换成为了开发和测试过程中的一个关键环节。本文将详细探讨如何实现Mock数据与真实API的无缝切换,并分享在联调阶段的核心技术及最佳实践。??Mock数据与真实API的背景概述在开发初期,API的设计和实现往往会滞后于前端界面的开发。此时,为了保证前端开发能够顺利进行,开发人员通常会使用Mock数据来模拟真实API的响应。这种方法可以帮助开发


没电脑=不能写代码?为什么我一个高中生能在手机上码 1万多行 C++,造了一个 GUI 库和一款肉鸽游戏?
Gamexyrs10/2/2025

当所有人都在说手机编程不可能,当别人在电脑上用 VS 欻欻欻敲代码时,我用 MT 管理器敲屏幕编代码,用 C4Droid编译打包程序。做了自己的界面库,做了自己的游戏。这篇文章主要介绍了我是怎么单凭手机一步步走过来的,也想为跟我相似的人提供一些方法。支持开源:所有代码已在 Github 开源,可在文章末尾链接查看。


Redis 内存淘汰策略 LRU 和传统 LRU 差异
程序员小29/30/2025

最近没被用过的,下次也大概率用不上。举个例子:你电脑桌面上放着常用的软件图标(微信、IDE),这些是最近常用的;而几个月没打开过的压缩工具,会被你拖到文件夹里。这就是 LRU 的思路:保留最近使用的,淘汰最近最少使用的。❝假设缓存容量只有 3,依次存入 A、B、C,此时缓存是 [A,B,C];若此时访问 A(A 变成最近使用),缓存顺序变为 [B,C,A]若再存入D(缓存满了),需要淘汰最近最少使用的 B,最终缓存是 [C,A,D]LFU的全称是。


【大数据毕设项目】基于大数据的茅台股票市场风险评估与可视化分析平台毕设源码\Hadoop+Spark茅台股票数据分析与预测平台
大数据毕设指导师9/30/2025

本文介绍了基于大数据的贵州茅台股票数据分析系统开发项目。项目利用Python、Spark、Hadoop等技术,构建了一个集成化的股票分析平台,包含价格趋势分析、技术指标分析、成交量分析等功能模块。系统通过数据挖掘和机器学习技术,为投资者提供全面、实时的市场分析,支持可视化展示。文章详细说明了项目背景、技术方案、核心内容及关键代码实现,展示了成交量趋势分析和价格区间分布的可视化效果。该项目为金融投资决策提供了科学依据,具有重要的实践价值。


AI辅助制作宣传视频
Enabler_Rx2025/10/10

首先写好文字稿子,然后用google gemini模型生成音频。可以选择很多种人声,我选择了language English(US)和callirrhoe的发声,模型文生音频链接: https://cloud.google.com/text-to-speech?hl=zh-CN 然后下载音频文件 使用Microsoft Clipchamp打开音频文件,插入图像内容,可以调节音频速度,加入字幕等 然后导出生成文件 完成!

首页编辑器站点地图

Copyright © 2025 聚合阅读

License: CC BY-SA 4.0