Eval()轉(zhuǎn)換JSON的作用是將JSON格式的字符串轉(zhuǎn)換為可供JavaScript語言讀取的對象。Eval()函數(shù)可以將以字符串形式存在的JavaScript代碼轉(zhuǎn)換成真正的JavaScript代碼,并且被執(zhí)行。因此,只有在你完全信任這個字符串來源時,才應(yīng)該使用eval()函數(shù)。
//例子
var jsonString = '{"name": "Bob", "age": 25}';
var obj = eval('(' + jsonString + ')');
console.log(obj);
//輸出: {name: "Bob", age: 25}
需要注意的是,eval()函數(shù)只會識別JSON格式的字符串,并且轉(zhuǎn)換成對象。如果JSON字符串格式錯誤,eval()函數(shù)將會拋出異常。此時,最好使用JSON.parse()函數(shù)進(jìn)行轉(zhuǎn)換。JSON.parse()函數(shù)是eval()函數(shù)的更好的替代品,因為它不會執(zhí)行任何其他的JavaScript代碼,從而有效地解決了eval()函數(shù)所帶來的安全性問題。
//eval()函數(shù)會出現(xiàn)安全問題
var jsonString = '{"name": "Bob", "age": 25}; alert("XSS attack");';
var obj = eval('(' + jsonString + ')');
console.log(obj);
//輸出:SyntaxError: missing ; before statement
//JSON.parse()函數(shù)可以更安全地轉(zhuǎn)換JSON字符串
var jsonString = '{"name": "Bob", "age": 25}; alert("XSS attack");';
var obj = JSON.parse(jsonString);
console.log(obj);
//輸出:SyntaxError: Unexpected token ; in JSON at position 19
總之,在使用eval()函數(shù)進(jìn)行JSON格式字符串轉(zhuǎn)換之前,應(yīng)當(dāng)確認(rèn)你所接收的字符串的來源,并謹(jǐn)慎對待。對于安全性要求較高的場合,建議使用JSON.parse()函數(shù)代替。