JSON.parse 與 eval() 對于解析json的問題(轉(zhuǎn))

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,但是經(jīng)過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);

結(jié)果:

3.我想很多人在糾結(jié)雙引號的問題,這里我們就來集中測試下。

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);

結(jié)果依次為:

可見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);

結(jié)果依次為:

而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 );

結(jié)果:

這里不加就出錯了。

那是因為eval()相當于一個執(zhí)行環(huán)境,當你不加括號的時候,jsonstr1會被認為是一條復(fù)合語句。運行的時候就會逐個字符的解析。

但是加上括號的時候,jsonstr1就當做一個表達式去運算。從括號開始就被當做了對象進行識別。

5.然后你又會想到,那這個括號為什么要加“()”,不能加“{}”么?

答案是:當然能加“{}”,只不過就會報錯而已~?!?—!

這時候你要明吧json的格式是什么!

{"name":"a","company":"b"} 這就是標準形式。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,646評論 19 139
  • 深入理解JavaScript系列文章,包括了原創(chuàng),翻譯,轉(zhuǎn)載,整理等各類型文章,如果對你有用,請推薦支持一把,給大...
    DaveWeiYong閱讀 711評論 0 1
  • 工廠模式類似于現(xiàn)實生活中的工廠可以產(chǎn)生大量相似的商品,去做同樣的事情,實現(xiàn)同樣的效果;這時候需要使用工廠模式。簡單...
    舟漁行舟閱讀 8,131評論 2 17
  • 0、對于 HTTP 協(xié)議而言,HTML、CSS、JS、JSON 的本質(zhì)都是什么? 1.對于HTTP協(xié)議而言,htm...
    saintkl閱讀 643評論 0 0
  • 迫不得已和有的陌生人有了一點點交集,被別人立馬判斷出了:我的內(nèi)心單純,我的世界簡單,我的社會閱歷太少……"社會"這...
    yu菇?jīng)?/span>閱讀 407評論 0 1

友情鏈接更多精彩內(nèi)容