封面:深夜工作台:一杯咖啡与一次调试的独白

深夜工作台:一杯咖啡与一次调试的独白

2026年5月12日 技术 约 2 分钟

凌晨一点,桌上的咖啡已经凉了一半,屏幕上那行报错像一句谜语。同事都睡了,只有我和这个诡异的 undefined 面面相觑。

问题出在一个看似无害的数组去重:

const uniq = (list) =>
  [...new Set(list.map(JSON.stringify))].map(JSON.parse);

它对普通对象工作得很好,直到某天列表里混进了 undefined——JSON.stringify(undefined) 返回的不是字符串,而是 undefined 本身。Set 里于是混进了异类,JSON.parse 当场翻脸。

调试的第一原则:不要相信你对代码的记忆,要相信断点告诉你的事实。

我最后是这样修的:

const uniq = (list) => {
  const seen = new Set();
  return list.filter((item) => {
    const key = item === undefined ? '__nil__' : JSON.stringify(item);
    if (seen.has(key)) return false;
    seen.add(key);
    return true;
  });
};

修完 bug,窗外恰好有夜班公交驶过,灯光在墙上扫出一道缓慢的弧线。把杯子里的凉咖啡一饮而尽,忽然想起某位前辈说过的话:所谓经验,就是那些让你在凌晨两点少熬一小时的东西。

今晚,又攒了一点。

# 调试# JavaScript# 深夜