日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 前端技术 > javascript >内容正文

javascript

JSON.parse与eval的区别

發(fā)布時(shí)間:2025/3/15 javascript 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JSON.parse与eval的区别 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

JSON.parse與eval和能將一個(gè)字符串解析成一個(gè)JSON對(duì)象,但還是有挺大區(qū)別。

測(cè)試代碼

var A = "{ a: 1 , b : 'hello' }"; var B = "{ 'a': 1 , 'b' : 'hello' }"; var C = "{'a':1,'b':'hello'}"; var D = '{"a":1,"b":"hello"}'; var E = '{ "a" : 1 , "b" : "hello" }'; var F = '{ "a" : 1 ,\n "b" : "hello" }'; var G = '{ "a" : 1 , "b" : window.location.href="https://www.baidu.com" }';

  

JSON.parse執(zhí)行:

例:JSON.parse(A);

A、B、C、G都不可轉(zhuǎn),D、E、F都可以。

eval執(zhí)行:

例:eval("("+A+")");

A到G都可以轉(zhuǎn),特別到G時(shí),頁(yè)面還跳轉(zhuǎn)到百度了。

JSON.parse

上面的演示例子可以看出,這方法只能解析屬性名是雙引號(hào)包裹的字符串對(duì)象,并會(huì)忽略換行和空格(值外面)。

但是,從MDN對(duì)JSON的描述,能解析的JSON字符串的條件完整如下:

JavaScript類型?JSON與之區(qū)別
對(duì)象和數(shù)組 屬性名稱必須用雙引號(hào)包裹; 最后一個(gè)屬性后面不能有逗號(hào)。
數(shù)值 前導(dǎo)0不能使用(在 JSON.stringify 中將會(huì)被忽略,在 JSON.parse 會(huì)拋出錯(cuò)誤); 小數(shù)點(diǎn)后面至少有一個(gè)數(shù)字。
字符串 只有有限的字符能夠被轉(zhuǎn)義; 不允許某些控制字符;但允許使用Unicode 行分隔符 (U+2028) 和段落分隔符 (U+2029) ; 字符串必須用雙引號(hào)括起來(lái)。

這方法還可以捕捉JSON中的語(yǔ)法錯(cuò)誤,并允許你傳入一個(gè)函數(shù),用來(lái)過濾或轉(zhuǎn)換解析結(jié)果。

瀏覽器兼容:IE8+

eval

eval函數(shù)可將一個(gè)JavaScript代碼字符串求值成特定的對(duì)象,所以解析成JSON對(duì)象只不過是作用之一。

為什么eval()解析JSON字符串要加上括號(hào)?

原因是兩點(diǎn):

1. json對(duì)象是以”{}”的方式來(lái)開始以及結(jié)束的,在JS中,它會(huì)被當(dāng)成一個(gè)語(yǔ)句塊來(lái)處理。

2.?加上圓括號(hào)為了處理字符串為表達(dá)式,而不是語(yǔ)句(statement)來(lái)執(zhí)行。

例子:

對(duì)象字面量 {},不加外層的括號(hào),那么eval會(huì)識(shí)別為JS代碼塊的開始和結(jié)束標(biāo)記,那么 {} 將會(huì)被認(rèn)為是執(zhí)行了一句空語(yǔ)句。

alert(eval("{}")); // return undefined alert(eval("({})"));// return object[Object]

不建議使用

雖然從演示例子看,eval的能力是強(qiáng)過于JSON.parse的,它可解析不規(guī)范的JSON字符串,但是G的例子也可以看出,eval是不安全的,特別是數(shù)據(jù)是第三方給予時(shí)候,你根本不知道eval之后它會(huì)干什么。

所以結(jié)論就是,乖乖用JSON.parse解析JSON對(duì)象。

$.parseJSON

jQuery也有提供解析JSON字符串的方法,$.parseJSON ,就目前jQuery版本來(lái)講,分為兩類。

2.x和3.x版本: $.parseJSON 都是直接使用 JSON.parse 的。

1.x版本:瀏覽器支持?JSON.parse?就用這個(gè),不支持就進(jìn)行校驗(yàn),確認(rèn)是JSON字符串,則用

( Function( "return " + str ) )()

返回對(duì)象,否則返回?zé)o效JSON對(duì)象error。

PS:之所以能用Function處理,前提是校驗(yàn)確認(rèn)為JSON字符串,不然還是不安全的轉(zhuǎn)換方法。

?

總結(jié)

eval是強(qiáng)烈不建議用來(lái)解析JSON字符串,但是凡事無(wú)絕對(duì),如果數(shù)據(jù)來(lái)源于你信任的并且格式也不大規(guī)范,那用它也不是不可以。

?

參考文獻(xiàn)

1.?https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/JSON

2.?https://code.jquery.com/jquery-1.12.4.js


本文為轉(zhuǎn)載文章,轉(zhuǎn)自地址 :http://www.cnblogs.com/lovesong/p/6036650.html

轉(zhuǎn)載于:https://www.cnblogs.com/zhilingege/p/6837843.html

總結(jié)

以上是生活随笔為你收集整理的JSON.parse与eval的区别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。