服務端返回的 JSON 數據往往是字符串格式(帶引號),直接訪問屬性會得到 undefined:
var json = '{"id":1}';
alert(json.id); // undefined —— 因為 json 是字符串,不是對象
eval() 能將符合 JS 語法的字符串作為代碼執行,從而將 JSON 字符串轉為對象:
var jsonStr = '{"id":1}';
var jsonObj = eval("(" + jsonStr + ")");
alert(jsonObj.id); // 1 —— 成功轉為對象
eval(jsonStr) 會將 {} 視為代碼塊而非對象字面量,導致語法錯誤或返回 undefined。必須寫成 eval("(" + jsonStr + ")")。
eval("(" + jsonStr + ")") 正確;eval('(' + jsonStr + ')') 會因單引號干擾內層雙引號導致解析失敗。
若 JSON 字符串最外層是數組 [...],可直接 eval(jsonStr):
var jsonArr = '[{"id":1}]';
var arr = eval(jsonArr);
alert(arr[0].id); // 1
原因:[] 不會被誤認為代碼塊,無需括號包裹。
強烈建議使用原生 JSON.parse() 替代 eval():
var jsonObj = JSON.parse(jsonStr); // 安全、快速、標準
var arr = JSON.parse(jsonArr);
| 特性 | eval() | JSON.parse() |
|---|---|---|
| 安全性 | 極低(執行任意代碼,XSS 風險) | 高(僅解析 JSON,無代碼執行) |
| 性能 | 慢(啟動解析器) | 快(原生優化) |
| 錯誤處理 | 困難 | 拋出 SyntaxError,可捕獲 |
| 標準化 | 非標準用法 | ES5 標準,所有現代瀏覽器支持 |
JSON,可引入 json2.js Polyfill。eval(),請嚴格驗證數據來源可信,並使用 new Function("return " + jsonStr)() 稍微安全些(但仍不推薦)。理解 eval() 解析 JSON 的原理與坑,是前端進階的基礎功。但在現代開發中,請無條件使用 JSON.parse()。它更安全、更快、更標準,也是所有主流框架(jQuery, Axios, Fetch API)內部的實現方式。