最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2016年02月21日 09:50:36   作者:韓子遲  
JSON (JavaScript Object Notation)一種簡單的數(shù)據(jù)格式,比xml更輕巧,下面通過本文給大家介紹JS中Eval解析JSON字符串的一個小問題,需要的朋友參考下吧

之前寫過一篇 關(guān)于 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ī)則很簡單: 對象是一個無序的“‘名稱/值'對”集合。一個對象以“{”(左括號)開始,“}”(右括號)結(jié)束。每個“名稱”后跟一個“:”(冒號);“‘名稱/值' 對”之間使用“,”(逗號)分隔

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

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

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

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

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

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

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

執(zhí)行后彈出 "hello world"。我們把 str 變量 "noString" 化,粗暴點的做法就是去掉外面的引號,內(nèi)部調(diào)整(轉(zhuǎn)義等),然后就變成了:

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 語句。前者的結(jié)果是:

{name: "hanzichi"}

這確實是一條合法的 JavaScript 語句。{} 我們不僅能在 if、for 語句等場景使用,甚至可以在任何時候,因為 ES6 之前 JavaScript 只有塊級作用域,所以對于作用域什么的并不會有什么沖突。去掉 {} 后 name: "hanzichi" 也是合法的語句,一個 label 語句,label 語句在跳出嵌套的循環(huán)中非常好用,具體可以參考 label,而作為 label 語句的標(biāo)記,name 是不能帶引號的,標(biāo)記能放在 JavaScript 代碼的任何位置,用不到也沒關(guān)系。

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

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

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

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

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

相關(guān)文章

  • javascript中的this詳解

    javascript中的this詳解

    avaScript 中的 this 關(guān)鍵字,深入淺出的分析其在不同情況下的含義,形成這種情況的原因以及 Dojo 等 JavaScript 工具中提供的綁定 this 的方法。可以這樣說,正確掌握了 JavaScript 中的 this 關(guān)鍵字,才算邁入了 JavaScript 這門語言的門檻。
    2014-12-12
  • JS/jQuery實現(xiàn)獲取時間的方法及常用類完整示例

    JS/jQuery實現(xiàn)獲取時間的方法及常用類完整示例

    這篇文章主要介紹了JS/jQuery實現(xiàn)獲取時間的方法及常用類,結(jié)合完整實例形式分析了javascript針對日期時間的獲取、轉(zhuǎn)換、計算與檢測相關(guān)操作技巧,需要的朋友可以參考下
    2019-03-03
  • JavaScript和jQuery獲取input框的絕對位置實現(xiàn)方法

    JavaScript和jQuery獲取input框的絕對位置實現(xiàn)方法

    下面小編就為大家?guī)硪黄狫avaScript和jQuery獲取input框的絕對位置實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-10-10
  • 原生js調(diào)用json方法總結(jié)

    原生js調(diào)用json方法總結(jié)

    本篇文章給大家詳細(xì)分析了js調(diào)用json方法的總結(jié),對此有需要的朋友可以參考學(xué)習(xí)下。
    2018-02-02
  • vue組件創(chuàng)建的三種方式小結(jié)

    vue組件創(chuàng)建的三種方式小結(jié)

    這篇文章主要介紹了vue組件創(chuàng)建的三種方式小結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • wangEditor編輯器失去焦點后仍然可以在原位置插入圖片分析

    wangEditor編輯器失去焦點后仍然可以在原位置插入圖片分析

    本文給大家?guī)淼氖且豢罘浅2诲e的富文本編輯器WangEditor,他最大的特點是它在ie6,7,8上都可以做到失去焦點后仍然可以在原位置插入圖片,而且代碼量很少,下面我們就來分析下他是如何實現(xiàn)的呢
    2015-05-05
  • JavaScript實現(xiàn)文本中間縮略的兩種方案

    JavaScript實現(xiàn)文本中間縮略的兩種方案

    項目中經(jīng)常會遇到縮略展示文字的場景,即要求文字在一行不換行展示,超出自動展示...,常用的展示效果有兩種,文字中間縮略以及文字末尾縮略,本文將通過代碼示例給大家詳細(xì)的講一下這兩種方案,需要的朋友可以參考下
    2024-06-06
  • localResizeIMG先壓縮后使用ajax無刷新上傳(移動端)

    localResizeIMG先壓縮后使用ajax無刷新上傳(移動端)

    隨著技術(shù)的發(fā)展,移動設(shè)備像素越來越高,但是這么大的圖片怎么上傳呢?下面小編就給大家一起學(xué)習(xí)移動端圖片上傳的方法之localResizeIMG先壓縮后使用ajax無刷新上傳,需要的朋友可以參考下
    2015-08-08
  • 解決使用layui對select append元素?zé)o效或者未及時更新的問題

    解決使用layui對select append元素?zé)o效或者未及時更新的問題

    今天小編就為大家分享一篇解決使用layui對select append元素?zé)o效或者未及時更新的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-09-09
  • JS簡單實現(xiàn)動態(tài)添加HTML標(biāo)記的方法示例

    JS簡單實現(xiàn)動態(tài)添加HTML標(biāo)記的方法示例

    這篇文章主要介紹了JS簡單實現(xiàn)動態(tài)添加HTML標(biāo)記的方法,結(jié)合實例形式分析了JavaScript使用createElement()方法針對頁面元素進(jìn)行動態(tài)操作相關(guān)實現(xiàn)技巧,需要的朋友可以參考下
    2018-04-04

最新評論

清苑县| 淮南市| 五指山市| 广德县| 绥江县| 普兰店市| 鄄城县| 恩施市| 弥勒县| 陆良县| 麟游县| 阿拉尔市| 旅游| 城市| 宕昌县| 鹤庆县| 象州县| 宁化县| 灯塔市| 新源县| 林芝县| 永福县| 浙江省| 东城区| 汶川县| 尉氏县| 潞城市| 罗江县| 吉林市| 宾阳县| 平潭县| 六枝特区| 方城县| 潞城市| 济源市| 房产| 恩施市| 平凉市| 衡阳县| 云霄县| 丘北县|