只有 1% 的開發(fā)人員能在 60 秒內找到代碼中的錯誤
下面這段簡單的 JavaScript 代碼里藏著一個不起眼但足以讓人抓狂的錯誤:
function getResult(a, b) {
return
{
result: a + b
};
}
console.log(getResult(2, 3)); // 結果真的是 5 嗎?
表面看上去,這只是一個“把兩個數(shù)相加,然后返回對象”的函數(shù),可實際運行后卻并非預期的 { result: 5 }
。乍一眼看不出任何毛病,但結果可能會讓你大吃一驚。
Bug 原因
實際輸出會是 undefined。為什么?這是 JavaScript 的自動分號插入(Automatic Semicolon Insertion, ASI)在作祟:
- return 語句后面由于換行,JavaScript 會在此自動插入一個分號。
- 花括號 {} 便被解釋成代碼塊而不是對象字面量。
- 這樣一來,真正的返回語句被看作 return;,函數(shù)自然就返回了 undefined。
用“JS 眼中的解釋”來寫就是:
return; // 這行被自動插入了分號
{
result: a + b;
}
如何修復
有兩種常見做法都能解決這個問題:
讓對象字面量跟在 return 同一行:
function getResult(a, b) {
return {
result: a + b
};
}
在對象外包一層小括號:
function getResult(a, b) {
return (
{
result: a + b
}
);
}
兩種寫法都能保證沒有意外的分號插入,從而讓函數(shù)正常返回 { result: 5 }
。
小結
這個 Bug 并不常見,但偶爾會讓人頭疼半天。如果在代碼中習慣把大括號換行到下一行,又忘了手動加分號,就可能被 ASI“坑”到。
平時可以多注意一下這個特性,或者手動在 return
后面寫對象時直接跟在同一行,避免自動分號的意外影響。自動格式化工具有時也會發(fā)生這種失誤,看到這里或許就知道要警惕什么了。