為什么eval某個json字符串時要加括號?


在做與服務器交互數據的時候,我們通常會發起一個Ajax請求,然后服務器返回一個類似'{x:1,y:1}'結構的json字符串,為了方便客戶端處理我們會將其轉換為一個對象直接量

這很多的時候通過一個eval來實現 

var jsonStr = '{x : 1, y : 1}';
var jsonObj = eval('(' +  jsonStr + ')');

 

如果eval的時候不加括號還會報腳本錯誤,這是為什么呢?

因為eval中 是一個執行環境,當你不用括號的時候{x : 1, y : 1}整個被解釋成一個復合語句,{和}在這里就是一個符合語句的分隔符,而不是我們原本認為的對象直接量的一種語法方式。就像我們通常寫if(true){x=1;}這里的大括號也是充當着復合語句的作用。

接下來x:被解釋成標簽,像通常用的swicth case語句中的case x:也是一種標簽,至於標簽的其他用法可以參考相關資料。后面的1被當做一個數字直接量

遇到y被解釋成變量標示符,然后再繼續解析y后的冒號時就出錯了,因為無法識別。所以如果你寫成eval('{x : 1, y = 1}')就不會報錯了,因為y=1是可以被識別的, y=1后eval的結果是返回1。

但是為什么前后加個括號就可以了呢,因為括號在這里表示強制執行,整個'(' +  jsonStr + ')'其實被解釋成一個表達式運算,而不是一個復合語句,因此jsonStr中的大括號{}被當成對象的語法來識別,當然就可以了。

 說完了上面,我們再來看一個例子,如果我們寫eval('{x:1}')這樣呢,這會報錯嗎?

答案是不會,因為雖然{x:1}被認為是一個復合語句,但是x:1這樣的寫法是沒錯的,當做標簽來識別,因此結果返回1 ,說白了只要讓{……}所表示的復合語句不讓解析不能理解就可以了,如{x:1, y=1,z=3}不會報錯,返回最后的結果3

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM