JS的全局函數eval解析JSON字符串

JS的全局函數eval解析JSON字符串

JavaScript eval() 函數

定義和用法

eval() 函數可計算某個字符串,並執行其中的的 JavaScript 代碼。

語法

eval(string)

參數描述string必需。要計算的字符串,其中含有要計算的 JavaScript 表達式或要執行的語句。

返回值

通過計算 string 得到的值(如果有的話)。

說明

該方法只接受原始字符串作為參數,如果 string 參數不是原始字符串,那麼該方法將不作任何改變地返回。因此請不要為 eval() 函數傳遞 String 對象來作為參數。

如果試圖覆蓋 eval 屬性或把 eval() 方法賦予另一個屬性,並通過該屬性調用它,則 ECMAScript 實現允許拋出一個 EvalError 異常。

拋出

如果參數中沒有合法的表達式和語句,則拋出 SyntaxError 異常。

如果非法調用 eval(),則拋出 EvalError 異常。

如果傳遞給 eval() 的 Javascript 代碼生成了一個異常,eval() 將把該異常傳遞給調用者。

例子 1

在本例中,我們將在幾個字符串上運用 eval(),並看看返回的結果:

輸出:

200

4

27

例子 2

看一下在其他情況中,eval() 返回的結果:

eval("2+3") // 返回 5
var myeval = eval; // 可能會拋出 EvalError 異常
myeval("2+3"); // 可能會拋出 EvalError 異常

可以使用下面這段代碼來檢測 eval() 的參數是否合法:

try {
alert("Result:" + eval(prompt("Enter an expression:","")));
}
catch(exception) {
alert(exception);
}

----------------------------------------------eval()解析JSON字符串----------------------------------------------------

0.eval解析函數:

JSON 不允許包含函數,但你可以將函數作為字符串存儲,之後再將字符串轉換為函數。

var text = '{ "name":"Runoob", "alexa":"function () {return 10000;}", "site":"www.runoob.com"}';
var obj = JSON.parse(text);
obj.alexa = eval("(" + obj.alexa + ")");

document.getElementById("demo").innerHTML = obj.name + " Alexa 排名:" + obj.alexa();

1.JSON字符串轉換為對象的兩種方法

 //將JSON字符串轉為JS對象的方法一
var obj = JSON.parse('{ "name":"runoob", "alexa":10000, "site":"www.runoob.com" }');
document.write(obj.name + "
");
//將JSON字符串轉為JS對象的方法二
//JSON格式的字符串

var test1 = '{"name":"qlq","age":25}';
var obj2 = eval("(" + test1 + ")"); //必須帶圓括號
document.write(obj2.name + "
" + obj2.age);

結果:

JS的全局函數eval解析JSON字符串

為什麼要 eval這裡要添加 eval("(" + test1 + ")")//”呢?

原因在於:eval本身的問題。 由於json是以”{}”的方式來開始以及結束的,在JS中,它會被當成一個語句塊來處理,所以必須強制性的將它轉換成一種表達式。

加上圓括號的目的是迫使eval函數在處理JavaScript代碼的時候強制將 括號內的表達式(expression)轉化為對象,而不是作為語 句(statement)來執行。舉一個例子,例如對象字面量{},如若不加外層的括號,那麼eval會將大括號識別為JavaScript代碼塊的開始 和結束標記,那麼{}將會被認為是執行了一句空語句。所以下面兩個執行結果是不同的:

alert(eval("{}"); // return undefined

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

對於這種寫法,在JS中,可以到處看到。

如: (function()) {}(); 做閉包操作時等。

alert(dataObj.root.length);//輸出root的子對象數量

$.each(dataObj.root,fucntion(idx,item){

if(idx==0){

return true;

}

//輸出每個root子對象的名稱和值

alert("name:"+item.name+",value:"+item.value);

})

注:對於一般的js生成json對象,只需要將$.each()方法替換為for語句即可,其他不變。

2.對於服務器返回的JSON字符串,如果jquery異步請求將 type(一般為這個配置屬性)設為“json”,或者利 用$.getJSON()方法獲得服務器返回,那麼就不需要eval()方法了,因為這時候得到的結果已經是json對象了,只需直接調用該對象即可,這 裡以$.getJSON方法為例說明數據處理方法:

$.getJSON("http://www.phpzixue.cn/",{param:"gaoyusi"},function(data){

//此處返回的data已經是json對象

//以下其他操作同第一種情況

$.each(data.root,function(idx,item){

if(idx==0){

return true;//同countinue,返回false同break

}

alert("name:"+item.name+",value:"+item.value);

});

});

這裡特別需要注意的是方式1中的eval()方法是動態執行其中字符串(可能是js腳本)的,這樣很容易會造成系統的安全問題。所以可以採用一些規避了eval()的第三方客戶端腳本庫,比如JSON in JavaScript就提供了一個不超過3k的腳本庫。


分享到:


相關文章: