麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > JavaScript > 正文

JS中Eval解析JSON字符串的一個小問題

2019-11-20 10:33:36
字體:
來源:轉載
供稿:網(wǎng)友

之前寫過一篇 關于 JSON 的介紹文章,里面談到了 JSON 的解析。我們都知道,高級瀏覽器可以用 JSON.parse() API 將一個 JSON 字符串解析成 JSON 數(shù)據(jù),稍微欠妥點的做法,我們可以用eval() 函數(shù)。

JSON (JavaScript Object Notation)一種簡單的數(shù)據(jù)格式,比xml更輕巧。 JSON 是 JavaScript 原生格式,這意味著在 JavaScript 中處理 JSON 數(shù)據(jù)不需要任何特殊的 API 或工具包。

JSON的規(guī)則很簡單: 對象是一個無序的“‘名稱/值'對”集合。一個對象以“{”(左括號)開始,“}”(右括號)結束。每個“名稱”后跟一個“:”(冒號);“‘名稱/值' 對”之間使用“,”(逗號)分隔

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

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

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

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

簡單地說,eval 函數(shù)的參數(shù)是一個字符串,如果把字符串 "noString" 化處理,那么得到的將是正常的可以運行的 JavaScript 語句。

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

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

執(zhí)行后彈出 "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" 化,執(zhí)行一下:

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

毫無疑問,一個 JSON 對象或者說是一個對象根本就不是能執(zhí)行的 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" 化,看看是不是能正確執(zhí)行的 JavaScript 語句。前者的結果是:

{name: "hanzichi"}

這確實是一條合法的 JavaScript 語句。{} 我們不僅能在 if、for 語句等場景使用,甚至可以在任何時候,因為 ES6 之前 JavaScript 只有塊級作用域,所以對于作用域什么的并不會有什么沖突。去掉 {} 后 name: "hanzichi" 也是合法的語句,一個 label 語句,label 語句在跳出嵌套的循環(huán)中非常好用,具體可以參考 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

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

本文并不會大談表達式,關于表達式,可以參考文末鏈接。值得記住的一點是,表達式永遠有一個返回值。大部分表達式會包裹在() 內,小括號內不能為空,如果有多個表達式,用逗號隔開,也就是所謂的逗號表達式,會返回最后一個的值。

以上所述是小編給大家介紹了JS中Eval解析JSON字符串的一個小問題,希望對大家有所幫助!

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 在线成人免费av | 7777久久香蕉成人影院 | 日日狠狠久久 | 亚州精品天堂中文字幕 | 久久久久久久久国产精品 | 色无极影院亚洲 | 欧美成人精品欧美一级 | 精品国产一区在线观看 | 国产一区视频在线免费观看 | 久草在线播放视频 | 亚洲国产高清一区 | 1024亚洲天堂 | 亚洲操比视频 | 一级毛片真人免费播放视频 | 欧美日本日韩 | 久久av免费 | 国产免费高清 | 亚洲欧美日韩在线 | 99激情| 中国女警察一级毛片视频 | 在线亚洲播放 | 男男羞羞视频网站国产 | 日韩黄色一级视频 | 成人免费乱码大片a毛片视频网站 | 久草在线新时代视觉 | 免费一级特黄做受大片 | 色网站在线免费观看 | 欧美一级特黄a | 国产羞羞视频在线免费观看 | 精品成人免费视频 | 最新亚洲国产 | 激情在线观看视频 | 国产在线导航 | 欧美aⅴ在线观看 | 成人在线视频免费观看 | 亚洲免费永久 | 日本a在线观看 | www.9191.com| 黄色成人小视频 | 免费黄色大片在线观看 | 免费黄色大片在线观看 |