免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
淺入淺出JS中的eval及json

聲明:

  首先聲明一下,本人是JS新手,所以不敢說(shuō)深入,只是把最近對(duì)eval的學(xué)習(xí)經(jīng)驗(yàn)?zāi)贸鰜?lái)跟大家分享,如果您是高手可略去不看。

適合讀者:

  對(duì)JS中的eval一知半解,不知eval是如何把字符串轉(zhuǎn)換為json對(duì)象的,在用eval把字符串轉(zhuǎn)換為json時(shí)常遇到“missing ] after element list”錯(cuò)誤卻不知哪兒錯(cuò)了的朋友

 

一、Eval介紹(這部分來(lái)自http://www.w3school.com.cn/js/jsref_eval.asp)

  定義和用法:eval() 函數(shù)可計(jì)算某個(gè)字符串,并執(zhí)行其中的的 JavaScript 代碼。

  語(yǔ)法:eval(string)

  參數(shù)string:必需。要計(jì)算的字符串,其中含有要計(jì)算的 JavaScript 表達(dá)式或要執(zhí)行的語(yǔ)句。

  返回值:通過計(jì)算 string 得到的值(如果有的話)。

  說(shuō)明:該方法只接受原始字符串作為參數(shù),如果 string 參數(shù)不是原始字符串,那么該方法將不作任何改變地返回。因此請(qǐng)不要為 eval() 函數(shù)傳遞 String 對(duì)象來(lái)作為參數(shù)。如果試圖覆蓋 eval 屬性或把 eval() 方法賦予另一個(gè)屬性,并通過該屬性調(diào)用它,則 ECMAScript 實(shí)現(xiàn)允許拋出一個(gè) EvalError 異常。

  異常:如果參數(shù)中沒有合法的表達(dá)式和語(yǔ)句,則拋出 SyntaxError 異常。如果非法調(diào)用 eval(),則拋出 EvalError 異常。如果傳遞給 eval() 的 Javascript 代碼生成了一個(gè)異常,eval() 將把該異常傳遞給調(diào)用者。

 

二、Eval用法示例

  對(duì)于編程方面的問題我一直認(rèn)為說(shuō)明問題最好的方法就是示例,看了上面的定義我們?cè)賮?lái)看幾個(gè)例子:

  code 1:

 1 var code1="\"a\" + 2";
2 var code2= {"a":2};
3 var code3 ="{\"b\":3}";
4
5 console.log(code1);
6 console.log(eval(code1));
7
8 console.log(code2);
9 console.log(code2.a);
10 console.log(eval(code2));
11 console.log(eval('('+ code2 +')'));
12
13 console.log(code3);
14 console.log(code3.b);
15 t = eval('('+code3+')');
16 console.log(t);
17 console.log(t.b);

  從5到17行分別會(huì)輸出什么呢?在這里簡(jiǎn)單解析一下:

  code1是一個(gè)字符串加數(shù)字的表達(dá)式字符串,所以第5行原樣輸出為"a"+2,第6行經(jīng)eval運(yùn)算后輸出a2。

  code2是一個(gè)json對(duì)象(關(guān)于json定義參考:深入淺出JSON),所以第8行輸出Object { a=2},如果用alert(code2)會(huì)彈出[object Object]。第9行輸出2。第10行呢,由于code2是一個(gè)json對(duì)象,不是一個(gè)字符串,因此eval在這里沒有起作用,原樣返回,所以跟第8行輸出一樣。第11行呢,由于code2已經(jīng)是一個(gè)json對(duì)象,把json對(duì)象兩邊加一個(gè)括號(hào)進(jìn)行運(yùn)算的結(jié)果是什么呢,JS中這個(gè)語(yǔ)法是錯(cuò)的,所以這行會(huì)報(bào)異常,如果我們捕獲一下異常輸出會(huì)是什么呢,就是新手非常頭痛的“missing ] after element list”了。

  code3是一個(gè)json格式的字符串,因此第13行輸出{"b":3}。第14行輸出undefined。第15行對(duì)這個(gè)字符串加括號(hào)(加括號(hào)的原因請(qǐng)看下文)后進(jìn)行eval運(yùn)算,把字符串轉(zhuǎn)換成了json對(duì)象,所以第16行輸出Object { b=3},第17行輸出3。

  是不是這樣呢,看看結(jié)果吧:

 

 

三、Eval把json格式字符串轉(zhuǎn)換為json對(duì)象為什么要加括號(hào)

  這一點(diǎn)園子里有一篇文章講得比較清楚(原文鏈接:eval和JSON),這里就不獻(xiàn)丑了,這里直接用原文的話來(lái)說(shuō)明。加上圓括號(hào)的目的是迫使eval函數(shù)在評(píng)估JavaScript代碼的時(shí)候強(qiáng)制將括號(hào)內(nèi)的表達(dá)式(expression)轉(zhuǎn)化為對(duì)象,而不是作為語(yǔ)句(statement)來(lái)執(zhí)行。舉一個(gè)例子,例如對(duì)象字面量{},如若不加外層的括號(hào),那么eval會(huì)將大括號(hào)識(shí)別為JavaScript代碼塊的開始和結(jié)束標(biāo)記,那么{}將會(huì)被認(rèn)為是執(zhí)行了一句空語(yǔ)句。所以下面兩個(gè)執(zhí)行結(jié)果是不同的:

  code 2:

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

  所以,code 1中第15行要加上括號(hào),如果不加會(huì)怎么樣呢,大家可以測(cè)試一下。關(guān)于這一點(diǎn),大家可以類比一下SQL語(yǔ)句,當(dāng)一個(gè)子查詢結(jié)果要做為關(guān)聯(lián)表用時(shí),會(huì)在查詢語(yǔ)句兩邊加上括號(hào),如:

  code 3:

selecttop10*from TB where ID notin (selecttop5 ID from TB)

 

四、jquery中ajax返回值的處理

  用eval把字符串轉(zhuǎn)換為json對(duì)象用的最多的地方就是在ajax中。ajax的返回值有些是json格式的字符串,所以要用eval('('+返回的json格式字符串+')')來(lái)轉(zhuǎn)換,這樣寫一般是沒有問題的,但現(xiàn)在有很多是用jquery中的ajax方法來(lái)做的,jquery的強(qiáng)大也讓很多人在用時(shí)容易忽略一些問題,比較常見的就是contentType跟dataType,contentType與本文沒什么關(guān)系,這里只說(shuō)說(shuō)dataType參數(shù)。

  dataType可用的類型有xml,html,script,json,jsonp,text,用的比較多的是xml,json,text。有些朋友在用時(shí)不管dataType是什么類型,都把返回值eval一下,有時(shí)碰巧對(duì)了,有時(shí)錯(cuò)了就不知道問題出在哪兒,一籌莫展。

  dataType是預(yù)期服務(wù)器返回的數(shù)據(jù)類型,如果不指定jQuery將自動(dòng)根據(jù)HTTP包MIME信息返回responseXML或responseText。也就是說(shuō)如果你dataType寫的是json格式,jQuery在返回時(shí)已經(jīng)把返回值轉(zhuǎn)換成了json對(duì)象,這時(shí)就不需要再用eval轉(zhuǎn)換了,如果dataType寫的是text才需要用eval轉(zhuǎn)換。

 

  希望本文對(duì)新手有所幫助,讓大家不再害怕eval跟json。歡迎留言討論。

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
jQuery ajax
JQuery中$.ajax()方法參數(shù)詳解
$.ajax()方法詳解
jQuery.ajax() datatype:“json" 轉(zhuǎn)換失敗
C# 將字符串解析運(yùn)算并返回結(jié)果
JavaScript初學(xué)者應(yīng)知的24條最佳實(shí)踐(譯)
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服