說(shuō)明:如果您有任何疑問或想咨詢其他業(yè)務(wù)請(qǐng)撥打電話 400 685 0732
全網(wǎng)監(jiān)測(cè)海量數(shù)據(jù)按需發(fā)布監(jiān)測(cè)預(yù)警
實(shí)時(shí)把握輿情動(dòng)態(tài)精準(zhǔn)追溯信息源頭
在python程序語(yǔ)言編寫的過(guò)程當(dāng)中,有一些函數(shù)是我們經(jīng)??梢钥匆姷?,但有些函數(shù)是比較罕見但確實(shí)會(huì)出現(xiàn)的,那今天小編就來(lái)說(shuō)一說(shuō)在日常使用過(guò)程當(dāng)中,并不是經(jīng)常常見的函數(shù)——pythoneval函數(shù)。
pythoneval函數(shù)——eval函數(shù)的作用是什么
eval函數(shù)是強(qiáng)大的數(shù)碼轉(zhuǎn)換引擎,字符串經(jīng)eval轉(zhuǎn)換后得到一個(gè)javascript對(duì)象,
舉簡(jiǎn)單例子:
vara=eval(“5″);等效于vara=5;
vara=eval(“’5′”);等效于vara=’5′;
varobj=eval(“({name:’cat’,color:’black’})”);等效于varobj={name:’cat’,color:’black’};
eval(“alert(‘helloworld!’);”);等效于alert(‘helloworld!’);
js的數(shù)據(jù)類型為弱類型,可以在定義的時(shí)候指定數(shù)據(jù)類型,也可以在運(yùn)算過(guò)程中強(qiáng)制數(shù)據(jù)類型轉(zhuǎn)換
一個(gè)對(duì)象經(jīng)過(guò)eval轉(zhuǎn)換后數(shù)據(jù)類型不確定,在相加過(guò)程中自動(dòng)與其他數(shù)據(jù)類型一致
eval應(yīng)用實(shí)例,如下:
后臺(tái)傳給前臺(tái)一個(gè)Json數(shù)據(jù)如
{“id”:1,”name”:”zhangsan”,”age”:30,”address”:”beijing”}
前臺(tái)這樣寫
function(returnedData,status){
varpeople=returnedData;
alert(people);
varid=people.id;
varname=people.name;
varage=people.age;
varaddress=people.address;
}
如上這樣寫得話,取到的returnedData是一個(gè)字符串而不是一個(gè)對(duì)象,所以下面取不到對(duì)象的屬性
如果將varpeople=eval(“(“+returnedData+”)”);
即可將people轉(zhuǎn)換成一個(gè)對(duì)象,也就取得對(duì)象的屬性了
pythoneval函數(shù)為何不常見
1、eval太神秘了,以至于很多人用錯(cuò)。所以不推薦使用。
比如這段代碼你應(yīng)該見過(guò):
<imgsrc=”https://pic3.***.com/50/bf68046fed17de9b1e195e3d7fcb247f_hd.jpg”data-rawwidth=”632″data-rawheight=”136″class=”origin_imagezh-lightbox-thumb”width=”632″data-original=”https://pic3.***.com/bf68046fed17de9b1e195e3d7fcb247f_r.jpg”>
然而實(shí)際上,我們可以這樣寫:
<imgsrc=”https://pic3.***.com/50/0d2bb9e0fbb2e206fdf707ac20b9b943_hd.jpg”data-rawwidth=”642″data-rawheight=”132″class=”origin_imagezh-lightbox-thumb”width=”642″data-original=”https://pic3.***.com/0d2bb9e0fbb2e206fdf707ac20b9b943_r.jpg”>這并不是eval不好而是因?yàn)槿菀妆挥缅e(cuò)。
eval只是一個(gè)普通的函數(shù),只不過(guò)他有一個(gè)快速通道通向編譯器,可以將string變成可執(zhí)行的代碼。有類似功能的還有Function,setInterval和setTimeout。
2、eval不容易調(diào)試。用chromeDev等調(diào)試工具無(wú)法打斷點(diǎn)調(diào)試,所以麻煩的東西也是不推薦使用的…
3、說(shuō)到性能問題,在舊的瀏覽器中如果你使用了eval,性能會(huì)下降10倍。在現(xiàn)代瀏覽器中有兩種編譯模式:fastpath和slowpath。fastpath是編譯那些穩(wěn)定和可預(yù)測(cè)(stableandpredictable)的代碼。而明顯的,eval不可預(yù)測(cè),所以將會(huì)使用slowpath,所以會(huì)慢。
還有一個(gè)是,在使用類似于ClosureCompiler等壓縮(混淆)代碼時(shí),使用eval會(huì)報(bào)錯(cuò)。
4、關(guān)于安全性,我們經(jīng)常聽到eval是魔鬼,他會(huì)引起XSS攻擊,實(shí)際上,如果我們對(duì)信息源有足夠的把握時(shí),eval并不會(huì)引起很大的安全問題。而且不光是eval,其他方式也可能引起安全問題。比如:
莫名其妙給你注入一個(gè)<script src=””>標(biāo)簽,或者一段來(lái)歷不明的JSON-P請(qǐng)求,再或者就是Ajax請(qǐng)求中的eval代碼…
所以啊,只要你的信息源不安全,你的代碼就不安全。不單單是因?yàn)閑val引起的。
你用eval的時(shí)候會(huì)在意XSS的問題,你越在意就越出問題,出的多了,eval就成噩夢(mèng)了。
5、效率問題是程序邏輯問題。對(duì)于一些有執(zhí)行字符串代碼需求的程序中,不用eval而用其他方式模擬反而會(huì)帶來(lái)更大的開銷。
以上就是有關(guān)pythoneval函數(shù)的所有內(nèi)容,如果大家還想了解更多與之有關(guān)的信息,歡迎關(guān)注我們文軍營(yíng)銷的官網(wǎng),這是你還有更多精彩的內(nèi)容等著你,不管你是查資料還是學(xué)習(xí)都能夠找到相應(yīng)的信息。
推薦閱讀
說(shuō)明:如果您有任何疑問或想咨詢其他業(yè)務(wù)請(qǐng)撥打電話 400 685 0732