哈喽大家好,我是大华。 在日常开发中,我们经常会遇到一些重复、冗长的代码。写起来费劲,读起来费神,维护起来更是头疼。而且代码越复杂,性能可能越受影响。 那有没有办法让代码更简洁、清晰又高效呢? 很多资深前端都在用,这篇文章整理了 12 个最实用的 JS 简写技巧,并结合实际场景进行优化和补充,帮助你写出更优雅的代码。 以前我们这样写条件判断: 现在可以用逻辑与( 适用场景:当 注意:仅适用于简单条件,避免滥用导致可读性下降。 传统做法是用 但问题来了:如果 推荐使用空值合并运算符: 只有当 最佳实践:处理 API 返回数据或配置项时特别有用。 想获取一个嵌套对象的属性: 但如果 过去需要层层判断: 现在只需: 如果任意一层为 支持方法调用: 老式拼接方式容易出错且难看: 用模板字符串(反引号)清爽多了: 优势: 从对象或数组中取值,再也不用手动赋值了。 还可以重命名、设默认值: 常用于函数参数解构、React 中的状态提取等。 传统函数: 箭头函数一行搞定: 优点: 注意:不要在对象方法或需要动态 插入元素也方便: 注意:扩展运算符是浅拷贝!嵌套对象仍共享引用。 遍历查找元素,过去常用 现在一行解决: 常用方法推荐: 示例: 当变量名与属性名一致时,无需重复书写: 特别适合构建 API 请求体、返回对象等场景。 以前计算幂要用 现在直接用 更接近数学表达习惯,支持负指数: ES2021 引入了三个逻辑赋值运算符,能进一步简化赋值逻辑。 小结: 将 例如: 解释: 应用于表单默认值、UI 渲染 fallback 等非常合适。 ✨ 它们的好处: ❗ 但也请注意: 如果你觉得这篇文章对你有帮助,欢迎点赞、收藏、转发!前言
JavaScript提供了许多现代语法特性,合理使用这些简写技巧,不仅能大幅减少代码量,还能提升可读性和执行效率。
1. 短路运算符:替代简单的 if 判断
if (isReady) {
startApp();
}&&)的短路特性简化为一行:isReady && startApp();isReady 为真值时才执行函数。
2. 空值合并运算符(??):精准设置默认值
|| 设置默认值:let name = username || '默认用户';username 是 0、'' 或 false,也会被替换成默认值 —— 这通常不是我们想要的。let name = username ?? '默认用户';username 是 null 或 undefined 时才会使用默认值,其他“假值”如 0、'' 都会被保留。
3. 可选链操作符(?.):安全访问深层属性
user.address.street.name;user 或 address 不存在,就会抛出错误。const streetName = user && user.address && user.address.street && user.address.street.name;const streetName = user?.address?.street?.name;null/undefined,返回 undefined 而不会报错。obj.method?.() 和数组索引:arr?.[index]
4. 模板字符串:字符串拼接
let message = 'Hello, ' + name + '! 你的余额是 ' + balance + ' 元。';let message = `Hello, ${name}! 你的余额是 ${balance} 元。`;
${}
5. 解构赋值:快速提取数据
对象解构:
// 旧写法
let name = user.name;
let age = user.age;
// 新写法
let { name, age } = user;let { name: userName, age = 18 } = user;数组解构:
let [first, second] = list;
let [, , third] = list; // 跳过前两个元素
6. 箭头函数:更简洁的函数定义
function multiply(a, b) {
return a * b;
}const multiply = (a, b) => a * b;
this,适合事件回调、.map() 等场景this的地方使用(比如 DOM 事件监听器),否则this指向会出问题。
7. 扩展运算符(…):轻松合并与复制
合并数组:
// 旧:concat()
let combined = array1.concat(array2);
// 新:扩展运算符
let combined = [...array1, ...array2];let newArr = [...array1, newItem, ...array2];合并对象:
let config = { ...defaultConfig, ...userConfig };
8. 数组高阶函数:替代 for 循环
for 循环:let found;
for (let i = 0; i < users.length; i++) {
if (users[i].id === targetId) {
found = users[i];
break;
}
}let found = users.find(user => user.id === targetId);
.find()
.filter()
.map()
.some()
.every()
.includes()
// 获取所有活跃用户的名字
const activeNames = users
.filter(u => u.isActive)
.map(u => u.name);
9. 对象属性简写:变量名即属性名
let name = '小明';
let age = 25;
// 旧写法
let user = {
name: name,
age: age
};
// 新写法
let user = {
name,
age
};
10. 指数运算符(**):更直观的幂运算
Math.pow():let result = Math.pow(2, 8); // 256**:let result = 2 ** 8; // 256let half = 2 ** -1; // 0.5
11. 逻辑赋值运算符:结合条件与赋值
场景一:只在为空时赋值
// 旧写法
if (user.role === null || user.role === undefined) {
user.role = 'guest';
}
// 新写法
user.role ??= 'guest'; // 等价于 user.role = user.role ?? 'guest';场景二:只有当前值为真才更新
user.isAdmin &&= false; // 若 isAdmin 为真,则设为 false场景三:拼接字符串或累加
message += welcomeText; // 原生已有
// 也可以用
message ||= 'default'; // 如果 message 是假值,则赋默认值
??=
&&=
||=
12. Nullish Coalescing 结合 Optional Chaining
?. 和 ?? 结合使用,可以构建极其健壮的数据访问逻辑。const displayName = user?.profile?.name ?? '匿名用户';
namenull 或 undefined,则返回默认值
总结
&& , ||
??
?.
`${}`
{} , []
=>
...
.find(), .map() 等
{ name }
**
??=, &&=, ||=
?. + ??
?. 和 ??)
本篇文章来源于微信公众号: 程序员刘大华
1 本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
2 本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
3 本站资源大多存储在云盘,如发现链接失效,请联系我们第一时间更新。











暂无评论内容