eval
mất một tuyên bố hoặc biểu thức JavaScript, nhưng {...}
sẽ có giá trị như một tuyên bố hoặc một biểu thức và ngữ pháp của JavaScript thích một tuyên bố.
Như một biểu:
{"10000048":"1","25000175":"2","25000268":"3"}
là một đối tượng với một số tài sản (những gì bạn muốn).
Như một tuyên bố, nó là một khối:
{ // begin Block
"10000048": // LabelledStatement (but the quotes are invalid)
"1", // Expression, calculate string "1" then discard it, then
"25000175": // you can't put a label inside an expression
mang đến cho một lỗi.
(nhãn JavaScript có thể được sử dụng để đặt tên một tuyên bố đặc biệt để sử dụng với break
/continue
. Họ là một chút vô nghĩa và hầu như không bao giờ sử dụng.)
Vì vậy, bằng cách thêm dấu ngoặc bạn giải quyết sự mơ hồ. Chỉ một biểu thức có thể bắt đầu bằng (
, do đó nội dung được phân tích cú pháp trong ngữ cảnh biểu thức, cho một đối tượng theo nghĩa đen chứ không phải ngữ cảnh câu lệnh.
Ngẫu nhiên, đây không phải là khá đủ để diễn giải chính xác tất cả các giá trị JSON có thể có. Do giám sát trong thiết kế của JSON, các ký tự U + 2028 và U + 2029, hai ký tự cuối dòng Unicode tối nghĩa, có giá trị để đặt không thoát trong một chuỗi JSON theo nghĩa đen, nhưng không phải trong chuỗi ký tự JavaScript.Nếu bạn muốn an toàn, bạn có thể trốn thoát chúng, ví dụ:
function parseJSON(s) {
if ('JSON' in window) return JSON.parse(s);
return eval('('+s.replace(/\u2028/g, '\\u2028').replace(/\u2029/g, '\\u2029')+')');
}
Tại sao bạn sử dụng 'eval' ngay từ đầu? Chỉ cần gắn bó với: 'var strJson = $ (" # status "). Val(). Replace ("; "," ");' –