深夜工作台:一杯咖啡与一次调试的独白
凌晨一点,桌上的咖啡已经凉了一半,屏幕上那行报错像一句谜语。同事都睡了,只有我和这个诡异的 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,窗外恰好有夜班公交驶过,灯光在墙上扫出一道缓慢的弧线。把杯子里的凉咖啡一饮而尽,忽然想起某位前辈说过的话:所谓经验,就是那些让你在凌晨两点少熬一小时的东西。
今晚,又攒了一点。