三亩地 三亩地SAN MU DI · CODE DIARY
CODE TIPS

实战代码技巧

每个技巧都给出"反模式 vs 推荐写法"的对照,配适用场景说明。看完就能用,用完就少写一行 bug。

可选链与空值合并代码示例 TIP · 01 · 可选链
TIP 01 · OPTIONAL CHAINING

别再写三层 if 判空了

取深层嵌套字段时,传统写法要一层层判断,代码丑且易漏。可选链 ?. 配合空值合并 ?? 一行搞定,且语义更清晰。

// ❌ 反模式:层层判断,丑且易漏
const city = user && user.address && user.address.city;
const name = user && user.name ? user.name : '匿名';

// ✅ 推荐:可选链 + 空值合并
const city = user?.address?.city;
const name = user?.name ?? '匿名';

适用场景:API 返回值解构、组件 props 透传、配置文件读取。注意 ?. 不能滥用——明确不会为空的对象不需要加,否则掩盖真实 bug。

少写一行判空,多读一行业务

—— 三亩地 · 代码技巧笔记

提前返回重构示意图 TIP · 02 · 提前返回
TIP 02 · EARLY RETURN

把 happy path 拉回最外层

嵌套的 if-else 是可读性杀手。用"提前返回"把异常分支先处理掉,主流程自然变成最外层的一组平铺逻辑。

// ❌ 反模式:箭头型嵌套
function getPrice(user) {
  if (user) {
    if (user.isVip) {
      if (user.coupon) {
        return user.price * 0.8 - user.coupon;
      } else {
        return user.price * 0.8;
      }
    } else {
      return user.price;
    }
  }
  return 0;
}

// ✅ 推荐:提前返回,主流程平铺
function getPrice(user) {
  if (!user) return 0;
  if (!user.isVip) return user.price;

  const discount = user.coupon ?? 0;
  return user.price * 0.8 - discount;
}

适用场景:表单校验、权限判断、参数预处理。原则:异常分支越早 return,主流程越清晰。

数组方法链式调用示意图 TIP · 03 · 数组方法
TIP 03 · ARRAY CHAINING

告别 for 循环里的多重职责

for 循环里既过滤又映射又求和,是典型反模式。用 filter / map / reduce 拆开,每一步职责单一,调试也好定位。

// ❌ 反模式:一个循环干三件事
let total = 0;
for (const u of users) {
  if (u.age >= 18 && u.active) {
    total += u.salary * 1.1;
  }
}

// ✅ 推荐:链式调用,每步单一职责
const total = users
  .filter(u => u.age >= 18 && u.active)
  .map(u => u.salary * 1.1)
  .reduce((sum, v) => sum + v, 0);

适用场景:列表筛选、统计聚合、数据转换。注意大数据量(万级以上)慎用,链式会创建多个中间数组。

防抖与节流时序图 TIP · 04 · 防抖节流
TIP 04 · DEBOUNCE & THROTTLE

高频事件别裸跑

搜索框输入、滚动监听、窗口 resize——这些事件每秒触发几十次,直接绑函数会让页面卡死。防抖与节流是必备武器。

// 防抖:停止触发后 wait 毫秒才执行一次
function debounce(fn, wait) {
  let timer;
  return (...args) => {
    clearTimeout(timer);
    timer = setTimeout(() => fn(...args), wait);
  };
}

// 节流:每 wait 毫秒最多执行一次
function throttle(fn, wait) {
  let last = 0;
  return (...args) => {
    const now = Date.now();
    if (now - last >= wait) {
      fn(...args);
      last = now;
    }
  };
}

// 适用:搜索框用 debounce,滚动监听用 throttle

适用场景:搜索联想用防抖,滚动加载用节流;按钮防连点用防抖,拖拽定位用节流。Lodash 的 debounce / throttle 是生产首选。

技巧不是炫技。能让下一个人在十秒内读懂你的代码,才是真正的好技巧。

— 三亩地 · 代码审美