from:https://www.cnblogs.com/zqzjs/p/4693958.html
1.eval()與JSOn.parse的不同
eval()
varc = 1;//全局變量varjsonstr1 = '{"name":"a","company":"b","value":++c}';varjson1 = eval('(' + jsonstr1 + ')');
console.log(json1.value);
c是全局變量為1,但是經過eval的解析,全局變量變成了2!(這樣的寫法是危險的)
JSON.parse
varc = 1;//全局變量varjsonstr1 = '{"name":"a","company":"b","value":++c}';varjson2 =JSON.parse(jsonstr1);
console.log(json2.value);
IE下報錯:
谷歌下報錯:
而JSON.parse則會報錯。
2.在++c中加上雙引號則就可以,因為它變成字符串了。
varc = 1;//全局變量varjsonstr1 = '{"name":"a","company":"b","value":“++c”}';varjson2 =JSON.parse(jsonstr1);
console.log(json2.value);
結果:
3.我想很多人在糾結雙引號的問題,這里我們就來集中測試下。
a:JSON.parse
varc = 1;//全局變量vardate =newDate();
console.log(date.toLocaleDateString());//var jsonstr1 = '{"name":"a","company":"b","value":"++c"}';//鍵,值都有雙引號varjsonstr2 = '{"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);varjson2 =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()
varc = 1;//全局變量vardate =newDate();
console.log(date.toLocaleDateString());varjsonstr1 = '{"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}';//全無雙引號varjson1 = 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()解析的時候要加上括號?
我們先看看不加括號會怎么樣:
varc = 1;//全局變量vardate =newDate();
console.log(date.toLocaleDateString());varjsonstr1 = '{"name":"a","company":"b","value":"++c"}';//鍵,值都有雙引號varjson1 =eval(jsonstr1);
console.log(json1+"? ? "+json1.value );
結果:
這里不加就出錯了。
那是因為eval()相當于一個執行環境,當你不加括號的時候,jsonstr1會被認為是一條復合語句。運行的時候就會逐個字符的解析。
但是加上括號的時候,jsonstr1就當做一個表達式去運算。從括號開始就被當做了對象進行識別。
5.然后你又會想到,那這個括號為什么要加“()”,不能加“{}”么?
答案是:當然能加“{}”,只不過就會報錯而已~。— —!
這時候你要明吧json的格式是什么!
{"name":"a","company":"b"} 這就是標準形式。