eval(); //此方法不建議
JSON.parse(); //推薦方法
一、兩種方法的差別
我們先初始化一個json格式的物件:
var jsonDate = '{ "name":"周星驰","age":23 }' var jsonObj = eval( '(' + jsonDate + ')' ); // eval();方法 var jsonObj = JSON.parse( jsonDate ); // JSON.parse(); 方法
然後在控制台呼叫:
console.log( jsonObj.name ); // 兩種方法都可以正確輸入 周星馳
那麼問題來了 兩種方法有什麼差別呢? (下面我們稍微把程式碼改動一下,藍色字體為修改部分)
var jsonDate = '{ "name":alert("hello"),"age":23 }' var jsonObj = eval( '(' + jsonDate + ')' ); // eval();方法 console.log( jsonObj.age ); //会先执行“alert”输出“hello” 然后才输出 23
換「JSON.parse();」方法:
var jsonDate = '{ "name":alert("hello"),"age":23 }' var jsonObj = JSON.parse( jsonDate ); // JSON.parse(); 方法 cosole.log( jsonobj.age ) // 报错 这个错误告诉我们这个字符串是不合法的
小結:「eval();」方法解析的時候不會去判斷字串是否合法,而且json物件中的js方法也會被執行,這是非常危險的;而「JSON.parse(); 」方法的優點就不用多說了,推薦此方法。 (不懂的盆友可以自己在控制台測試一下)
二、擴充問題
大家可以看到在上面測試時一直用紅色把包在花括號外面的引號標註了起來,這對引號是很關鍵卻又是常常被忽略的,因為“eval();” 和“JSON .parser();” 這兩個方法的參數只接受字串,也就是說只能解析字串!!
那我不經會有一個思考,我們在初始化的時候若不加引號對,那麼它本身就是對象,js可以直接獲取對象本身的屬性和方法;為什麼還要加引號將它變成字符串之後再用「eval();」 或「JSON.parse();」 解析,這樣做不是既不環保又沒有效率嗎?
原因很簡單:前端提供給後台的只能是字串資料格式,後台回傳給前台的就看返回的是什麼資料格式,是字串就必須解析之後再用。
(這個小問題一般大家都會忽略掉,不太關注。我之所以好奇的原因也是因為對後台了解的不夠,把這個問題拋出來希望對後台不熟的朋友有所幫助,知道是怎麼回事後自然而然會加深記憶,在開發過程中就不會漏掉了)
以上所述就是本文的全部內容了,希望大家能夠喜歡。