程序员的第一课:别用字符串比较做状态判断

今天修了一个很有意思的 bug,顺手记录一下。 问题现象 CloverTools 里有个「反应力测试」工具,逻辑很简单:页面变绿的时候点一下,测你的反应时间。但这个工具有个诡异的 bug——有时候正常,有时候点完没反应,有时候明明点得很早却提示"太早了"。 试了很久才发现:同一个颜色,area.style.background 有时候返回 #e74c3c,有时候返回 rgb(231, 76, 60)。两个值肉眼看起来一模一样,但 JavaScript 字符串比较不相等。 "#e74c3c" === "rgb(231, 76, 60)" // false 所以状态机就乱了。代码本意是: if (area.style.background === "#e74c3c") { // idle 状态,显示红色 } else if (area.style.background === "rgb(46, 204, 113)") { // green 状态,可以点击 } 但 #e74c3c 和 rgb(231, 76, 60) 是同一个颜色,浏览器的 style.background 返回哪个,取决于你是用十六进制赋值还是 RGB 赋值,甚至可能取决于浏览器的内部实现。 ...

May 19, 2026