eval(); //此方法不推薦前端
JSON.parse(); //推薦方法json
1、兩種方法的區別測試
咱們先初始化一個json格式的對象:字體
var jsonDate = '{ "name":"周星馳","age":23 }'spa
var jsonObj = eval( '(' + jsonDate + ')' ); // eval();方法對象
var jsonObj = JSON.parse( jsonDate ); // JSON.parse(); 方法開發
而後在控制檯調用:字符串
console.log( jsonObj.name ); // 兩種方法均可以正確輸入 周星馳console
那麼問題來了 兩種方法有什麼區別呢?(下面咱們稍微把代碼改動一下,藍色字體爲修改部分)效率
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();」方法的優勢就不用多說了,推薦此方法。(不明白的盆友能夠本身在控制檯測試一下)
2、擴展問題
var jsonDate = '{ "name":"周星馳","age":23 }'
你們能夠看到在上面測試時一直用紅色把包在花括號外面的引號標註了起來,這對引號是很關鍵卻又是經常被忽略的,由於 「eval();」 和 「JSON.parser();」 這兩個方法的參數只接受字符串,也就是說只能解析字符串!!
那我不經會有一個思考,咱們在初始化的時候若不加引號對,那麼它自己就是對象,js能夠直接獲取對象自己的屬性和方法;爲何還要加引號將它變成字符串以後再用 「eval();」 或者 「JSON.parse();」 解析,這樣作不是既不環保又沒有效率嗎?
緣由很簡單:前端提供給後臺的只能是字符串數據格式,後臺返回給前臺的就看返回的是什麼數據格式,是字符串就必須解析以後再用。
(這個小問題通常你們都會忽略掉,不太關注。我之因此好奇的緣由也是由於對後臺瞭解的不夠,把這個問題拋出來但願對後臺不熟的朋友有所幫助,知道是怎麼回過後天然而然會加深記憶,在開發過程當中就不會漏掉了)