在處理JSON數(shù)據(jù)的過程中,我們經(jīng)常會用到eval()函數(shù)來把JSON格式的字符串轉(zhuǎn)換為JavaScript對象。但是,有時(shí)候我們會遇到eval()失敗的情況。
var jsonString = '{ "name": "Tom", "age": 18 }'; var jsonObj = eval('(' + jsonString + ')');
上面的代碼看上去很簡單,我們把一個(gè)JSON格式的字符串轉(zhuǎn)換為了一個(gè)JavaScript對象。但是,如果我們的JSON數(shù)據(jù)存在一些語法錯誤,那么eval()函數(shù)就會失敗。
var jsonString = '{ "name": "Tom", "age": 18, }'; var jsonObj = eval('(' + jsonString + ')');
這個(gè)例子中,我們在最后一個(gè)屬性后面加了一個(gè)逗號,這是一種常見的錯誤。在瀏覽器中運(yùn)行這個(gè)代碼,會顯示出一個(gè)“語法錯誤”的提示。
除了語法錯誤之外,eval()還存在其他的安全問題。由于eval()會執(zhí)行所有傳入的代碼,所以如果傳入的JSON數(shù)據(jù)來自于用戶輸入,那么就有可能會存在惡意代碼注入的風(fēng)險(xiǎn),這會給我們的應(yīng)用程序帶來安全隱患。
因此,在處理JSON數(shù)據(jù)時(shí),我們應(yīng)該避免直接使用eval()函數(shù)。替代方法包括使用JSON.parse()函數(shù)(在老一些版本的瀏覽器中需要使用json2.js庫)或者使用服務(wù)器端解析JSON數(shù)據(jù)。
var jsonString = '{ "name": "Tom", "age": 18 }'; var jsonObj = JSON.parse(jsonString);
使用上述代碼可以解決eval()函數(shù)的安全和可靠性問題,可以放心使用。