1.eval()與JSOn.parse的不同
eval()
var c = 1; //全局變量
var jsonstr1 = '{"name":"a","company":"b","value":++c}'; var json1 = eval('(' + jsonstr1 + ')'); console.log(json1.value);
c是全局變量為1,但是經過eval的解析,全局變量變成了2!(這樣的寫法是危險的)
JSON.parse
var c = 1; //全局變量
var jsonstr1 = '{"name":"a","company":"b","value":++c}'; var json2 = JSON.parse(jsonstr1); console.log(json2.value);
IE下報錯:
谷歌下報錯:
而JSON.parse則會報錯。
2.在++c中加上雙引號則就可以,因為它變成字符串了。
var c = 1; //全局變量
var jsonstr1 = '{"name":"a","company":"b","value":“++c”}'; var json2 = JSON.parse(jsonstr1); console.log(json2.value);
結果:
3.我想很多人在糾結雙引號的問題,這里我們就來集中測試下。
a:JSON.parse
var c = 1; //全局變量
var date = new Date(); console.log(date.toLocaleDateString()); //var jsonstr1 = '{"name":"a","company":"b","value":"++c"}';//鍵,值都有雙引號
var jsonstr2 = '{"name":"a","company":"b","value":++c}';//僅++c上午雙引號
//var jsonstr3 = '{name:"a",company:"b",value:"++c"}';//僅有值上有雙引號
//var jsonstr4 = '{name:a,company:b,value:++c}';//全無雙引號
//var json1 = JSON.parse(jsonstr1);
var json2 = JSON.parse(jsonstr2); //var json3 = JSON.parse(jsonstr3);
//var json4 = JSON.parse(jsonstr4);
//console.log(json1 );
console.log(json2 ); //console.log(json3);
//console.log(json4);
結果依次為:
可見JSON.parse中只有第一種標准形式才會解析正確
b:eval()
var c = 1; //全局變量
var date = new Date(); console.log(date.toLocaleDateString()); var jsonstr1 = '{"name":"a","company":"b","value":"++c"}';//鍵,值都有雙引號
//var jsonstr2 = '{"name":"a","company":"b","value":++c}';//僅++c上午雙引號
//var jsonstr3 = '{name:"a",company:"b",value:"++c"}';//僅有值上有雙引號
//var jsonstr4 = '{name:a,company:b,value:++c}';//全無雙引號
var json1 = eval('('+jsonstr1+')'); //var json2 = eval('('+jsonstr2+')');
//var json3 = eval('('+jsonstr3+')');
//var json4 = eval('('+jsonstr4+')');
console.log(json1+" "+json1.value ); //console.log(json2+" "+json2.value );
//console.log(json3 + " " + json3.value);
//console.log(json4+" "+json3.value);
結果依次為:
而eval中除了最后一種,其他都解析正確。
4.這時候還有一個問題:那就是為什么eval()解析的時候要加上括號?
我們先看看不加括號會怎么樣:
var c = 1; //全局變量
var date = new Date(); console.log(date.toLocaleDateString()); var jsonstr1 = '{"name":"a","company":"b","value":"++c"}';//鍵,值都有雙引號
var json1 = eval(jsonstr1); console.log(json1+" "+json1.value );
結果:
這里不加就出錯了。
那是因為eval()相當於一個執行環境,當你不加括號的時候,jsonstr1會被認為是一條復合語句。運行的時候就會逐個字符的解析。
但是加上括號的時候,jsonstr1就當做一個表達式去運算。從括號開始就被當做了對象進行識別。
5.然后你又會想到,那這個括號為什么要加“()”,不能加“{}”么?
答案是:當然能加“{}”,只不過就會報錯而已~。— —!
這時候你要明吧json的格式是什么!
{"name":"a","company":"b"} 這就是標准形式。