淺談JSON.parse()、JSON.stringify()和eval()的作用

来源:http://www.cnblogs.com/DTBelieve/archive/2016/04/01/5346603.html
-Advertisement-
Play Games

相信大家對於JSON應該不陌生,度娘對這個名詞的解釋大致如下: “JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式。它基於ECMAScript的一個子集。因為採用獨立於語言的文本格式,也使用了類似於C語言家族的習慣,擁有了這些特性使JSON成為理想的數據交 ...


  相信大家對於JSON應該不陌生,度娘對這個名詞的解釋大致如下:

  “JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式。它基於ECMAScript的一個子集。因為採用獨立於語言的文本格式,也使用了類似於C語言家族的習慣,擁有了這些特性使JSON成為理想的數據交換語言,作用是易於人閱讀和編寫,同時也易於機器解析和生成(一般用於提升網路傳輸速率)。”  

  今天在這裡筆者想簡單談談jquery裡面的JSON.parse()和JSON.stringify()函數,順便還會提一下原生JS裡面的eval()函數

(1)JSON.parse 函數

作用:將 JavaScript 對象表示法 (JSON) 字元串轉換為對象。  

語法:JSON.parse(text [, reviver])

參數:

  • text  必需。 一個有效的 JSON 字元串。
  • reviver  可選。 一個轉換結果的函數。 將為對象的每個成員調用此函數。

返回值:一個對象或數組

example:

1 var json = '{"name":"GDT","age":23,"University":"GDUT"}';
2 var info = JSON.parse(json);  //解析為JSON對象
3 document.write(info.name + ' is a student of ' + info.University + ' and he is ' + info.age + " years old."); /info為Object對象

 

(2)JSON.stringify()函數

作用:將 JavaScript 值轉換為 JavaScript 對象表示法 (JSON) 字元串

語法:JSON.stringify( value [, replacer] [, space])

參數:

  • value  必需,通常為需要轉換的JavaScript值(通常為對象或者數組)
  • replacer  可選,用於轉換結果的函數或者數組
  • space  可選。向返回值 JSON 文本添加縮進、空格和換行符以使其更易於讀取。

返回值:一個包含JSON文本的字元串

 example:

1 var info = {name:"GDT",age:23,University:"GDUT"};
2 var json = JSON.stringify(info); //轉換為JSON字元串
3 document.write(json); //output為{"name":"GDT","age":23,"University":"GDUT"}

  

(3)eval()函數

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

語法:eval(string)

參數:

  • string  必需,要計算的字元串,其中含有要計算的 JavaScript 表達式或要執行的語句。

返回值:返回計算string的值,如果有的話 (沒有則不做任何改變返回)

example:

1 eval("x=10;y=20;document.write(x*y)");  //output為200
2 document.write(eval("2+2"));  //output為4
3 var x=10;
4 document.write(eval(x+17));  //output為27

 

  使用eval()函數也可以將JSON字元串解析為對象,這個功能能完成JSON.parse()的功能,但是有不一樣的地方,請看下麵代碼

1 // JSON.parse()
2 var json = '{"name":"GDT","age":23,"University":"GDUT"}';
3 var info = JSON.parse(json);    //解析為JSON對象
4 document.write(info);            //output為[object Object]
5 
6 //eval()
7 var json = '{"name":"GDT","age":23,"University":"GDUT"}';
8 var info = eval('(' + json + ')');  //解析為JSON對象
9 document.write(info);            //output為[object Object]

  不知道大家有木有註意到eval()還要用一對圓括弧將字元串包起來,對此我尋找到比較好的解釋就是:

  • 原因:歸結於eval本身的問題,由於json是以”{}”的方式來開始以及結束的,在JS中,它會被當成一個語句塊來處理,所以必須強制性的將它轉換成一種表達式。
  • 解決方法:加上圓括弧的目的是迫使eval函數在處理JavaScript代碼的時候強制將括弧內的表達式(expression)轉化為對象,而不是作為語句(statement)來執行。舉一個例子,例如對象字面量{},如若不加外層的括弧,那麼eval會將大括弧識別為JavaScript代碼塊的開始和結束標記,那麼{}將會被認為是執行了一句空語句。請看下列例子的不同
1 alert(eval("{}"));             // return undefined
2 alert(eval('('+'{}'+')'));     // return object[Object] 

 

  另外,相對於寫法格式嚴格的JSON.parse()來說,eval()可以解析任何字元串,eval是不安全的,因為eval比較寬鬆,會有潛在的安全性問題。比如以下代碼:

1 var str1 = '{"a":"b"}';
2 document.write(eval("("+str1+")"));   //正常解析為對象
3 var str2 = '{"a": (function(){alert("I can do something bad!");})()}';
4 eval('('+str2+')');                   //可以用來執行木馬腳本            

  如果用惡意用戶在json字元串中註入了向頁面插入木馬鏈接的腳本,用eval也是可以操作的,而用JSON.parse()則不必擔心這個問題,可見,雖然eval()功能很強大,但是實際用到的機會並不多。  

  個人總結的時候到了,這是我人生第一篇的博客,在4月1號Fool's Day誕生,寫得不好的地方還希望各位多多見諒,現在技術非常渣,我很希望現在能夠一點一滴去積累知識,為日後的成功奠定好基礎,fighting~

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 第一章、瞭解web及網路基礎 1.2 http的誕生 HTTP於1990年問世,那時候HTTP並沒有作為正式的標準被建立,被稱為HTTP/0.9 HTTP正式作為標準被公佈是在1996年5月,版本被命名為HTTP/1.0,該協議至今仍被廣泛用在伺服器端。 HTTP/1.1於1997年1月公佈,是目前 ...
  • 開始這個實例之前,我們簡單談一下Node.js吧,Node.js是一個由JavaScript書寫而成的強大Web開發框架,它讓開發強壯的、伸縮性良好的伺服器端Web應用變得更加簡單、容易。這種技術誕生於09年末,在一個JavaScript大會上宣佈,當時這項在伺服器端運行JavaScript技術讓所 ...
  • 前幾天寫的那個拖拽,自己留下的疑問。。。這次在熱心博友的提示下又修正了一些小小的bug,也加了拖拽的邊緣檢測部分。。。就再聊聊拖拽吧 一、不要直接操作dom元素 react中使用了虛擬dom的概念,目地就是要儘量避免直接操作dom元素,所以我們在對dom元素進行操作的時候需要註意,我之前為了獲取fo ...
  • 本文同步至微信公眾號http://mp.weixin.qq.com/s?__biz=MzAxMzgwNDU3Mg==&mid=402267570&idx=1&sn=4b0dc27842c32d902bad2dc4eea75f9a#rd 感興趣的可以掃碼關註哈 生命周期(Life Cycle)這個詞, ...
  • test 隨著自己對於web前端知識瞭解的越多,越來越發現自己真的好菜 一臉茫然階段 兩年前大學接觸網頁設計,那時對於網頁設計一竅不通,只是看了一本自己大學編的一本入門教材,我甚至不知道那些網頁設計的代碼是乾什麼用的,大學的老師自己講的很投入,然而我並不懂。最後考試他就划了重點。我們只要記一些簡單的 ...
  • 一直以來,大家都在說Javascript是單線程,瀏覽器無論在什麼時候,都且只有一個線程在運行JavaScript程式。 但是,不知道大家有疑問沒——就是我們在編程過程中的setTimeout(類似的還有setInterval、Ajax),不是非同步執行的嗎?!! 例如: 運行代碼,打開chrome調 ...
  • Atitit.獲得向上向下左的右的鄰居的方法 軟鍵盤的設計.. Left right可以直接使用next prev.. Up down可以使用pix 判斷...獲得next element的position...比較top 不過,要是跨block的化...僅僅所有的可以使用positon方案了... ...
  • 1.淺複製VS深複製 本文中的複製也可以稱為拷貝,在本文中認為複製和拷貝是相同的意思。另外,本文只討論js中複雜數據類型的複製問題(Object,Array等),不討論基本數據類型(null,undefined,string,number和boolean),這些類型的值本身就存儲在棧記憶體中(stri ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...