javascript中eval解析JSON字串,evaljson

來源:互聯網
上載者:User

javascript中eval解析JSON字串,evaljson

我們都知道,進階瀏覽器可以用  JSON.parse() API 將一個 JSON 字串解析成 JSON 資料,稍微欠妥點的做法,我們可以用 eval() 函數。

var str = '{"name": "hanzichi", "age": 10}';var obj = eval('(' + str + ')');console.log(obj); // Object {name: "hanzichi", age: 10}

是否注意到,向 eval() 傳參時,str 變數外裹了一層小括弧?為什麼要這樣做?

我們先來看看 eval 函數的定義以及使用。

eval() 的參數是一個字串。如果字串表示了一個運算式,eval() 會對錶達式求值。如果參數表示了一個或多個 JavaScript 聲明, 那麼 eval() 會執行聲明。不要調用 eval() 來為算數運算式求值; JavaScript 會自動為算數運算式求值。

簡單地說,eval 函數的參數是一個字串,如果把字串 “noString” 化處理,那麼得到的將是正常的可以啟動並執行 JavaScript 語句。

怎麼說?舉個栗子,如下代碼:

var str = "alert('hello world')";eval(str);

執行後彈出 “hello world”。我們把 str 變數 “noString” 化,粗暴點的做法就是去掉外面的引號,內部調整(轉義等),然後就變成了:

alert('hello world')

very good!這是正常的可以啟動並執行 JavaScript 語句!運行之!

再回到開始的問題,為什麼 JSON 字串要裹上小括弧。如果不加,是這個樣子的:

var str = '{"name": "hanzichi", "age": 10}';var obj = eval(str); // Uncaught SyntaxError: Unexpected token :

恩,報錯了。為什麼會報錯?試試把 str “noString” 化,執行一下:

{"name": "hanzichi", "age": 10}; // Uncaught SyntaxError: Unexpected token :

毫無疑問,一個 JSON 對象或者說是一個對象根本就不是能執行的 JavaScript 語句!等等,試試以下代碼:

var str = '{name: "hanzichi"}';var obj = eval(str);console.log(obj); // hanzichi

這又是什麼鬼?但是給 name 加上 “” 又報錯?

var str = '{"name": "hanzichi"}';var obj = eval(str); // Uncaught SyntaxError: Unexpected token :console.log(obj);

好吧,快暈了,其實還是可以將 str “nostring” 化,看看是不是能正確執行的 JavaScript 語句。前者的結果是:

{name: "hanzichi"}

這確實是一條合法的 JavaScript 語句。{} 我們不僅能在 if、for 語句等情境使用,甚至可以在任何時候,因為 ES6 之前 JavaScript 只有塊級範圍,所以對於範圍什麼的並不會有什麼衝突。去掉 {} 後 name: "hanzichi"也是合法的語句,一個 label 語句,label 語句在跳出嵌套的迴圈中非常好用,具體可以參考 label,而作為 label 語句的標記,name 是不能帶引號的,標記能放在 JavaScript 代碼的任何位置,用不到也沒關係。

一旦一個對象有了兩個 key,比如 {name: "hanzichi", age: 10} ,ok,兩個 label 語句?將 “hanzhichi” 以及 10 分別看做是語句,但是 語句之間只能用封號串連!(運算式之間才能用逗號)。所以改成下面這樣也是沒有問題的:

var str = '{name: "hanzichi"; age: 10}';var obj = eval(str); console.log(obj); // 10

越扯越遠,文章開頭代碼的錯誤的原因是找到了,為什麼套個括弧就能解決呢?簡單來說,() 會把語句轉換成運算式,稱為語句運算式。括弧裡的代碼都會被轉換為運算式求值並且返回,對象字面量必須作為運算式而存在。

本文並不會大談運算式,值得記住的一點是,運算式永遠有一個傳回值。大部分運算式會包裹在() 內,小括弧內不可為空,如果有多個運算式,用逗號隔開,也就是所謂的逗號運算式,會返回最後一個的值。

您可能感興趣的文章:
  • javascript eval和JSON之間的聯絡
  • js下用eval產生JSON對象
  • jqeury eval將字串轉換json的方法
  • jquery eval解析JSON中的注意點介紹
  • js使用eval解析json(js中使用json)
  • js使用eval解析json執行個體與注意事項分享
  • 為什麼JS中eval處理JSON資料要加括弧
  • JS使用eval解析JSON的注意事項分析
  • javascript巧用eval函數組裝表單輸入項為json對象的方法

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.