天天看點

eval和JSON.parse的差別

我們将一個字元串解析成json對象時可以使用兩種方法:

假設我們有一個json格式的字元串:

'{
    "student" : [
        {"name":"鳴人","age":17}, 
        {"name":"小櫻","age":17},
        {"name":"佐助","age":17}
    ]
}'
           

然後我們需要把它解析成json對象

1、eval()代碼如下:

var data = '
{
"student" : 
[
{"name":"鳴人","age":17}, 
{"name":"小櫻","age":17},
{"name":"佐助","age":17}
]
}';
eval('(' + data + ')');
           

2、JSON.parse()代碼如下:

var data = '
{
"student" : 
[
{"name":"鳴人","age":17}, 
{"name":"小櫻","age":17},
{"name":"佐助","age":17}
]
}
';
JSON.parse(data);

           

差別:eval方法不會去檢查給的字元串是否符合json的格式~同時如果給的字元串中存在js代碼eval也會一并執行~比如如果上面的json格式的字元串改為:

var data = '{
"student" : 
[
{"name":"鳴人","age":17}, 
{"name":"小櫻","age":alert("hehe")},
{"name":"佐助","age":17}
]
}';
           

此時執行eval方法後會先彈出一個提示框輸出hehe的字元串~

但是使用JSON.parse()就會報錯~顯示錯誤資訊為目前字元串不符合json格式~即JSON.parse()方法會檢查需要轉換的字元串是否符合json格式~

相比較而言eval方法是很危險的~特别是當涉及到第三方時我們需要確定傳給eval的參數是我們可以控制的~不然裡面插入比如window.location~指向一個惡意的連接配接~那叫叫天啦

從這個層面講~還是推薦使用JSON.parse來實作json格式字元串的解析

考慮到我們在制造json格式的字元串時極易出現錯誤~這裡推薦一個json格式字元串的線上校驗工具:http://jsonlint.com

繼續閱讀