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


JSON.parse() 函數
作用: 將JavaScript 對象表示法(json)字符串轉換成對象
語法: JSON.parse(text, [,reviver])
  參數: text: 必需, 一個有效的 json 字符串
    reviver: 可選。 一個轉換結果的函數。 將為對象的每個成員調用此函數 
返回值: 返回一個對象或者數組
 var json = '{"name":"GDT","age":23,"University":"GDUT"}'; var info = JSON.parse(json);  //解析為JSON對象
console.log(json)  // 結果 {"name":"GDT","age":23,"University":"GDUT"}
console.log(typeof info) // 結果 object
 
JSON.stringify() 函數
作用: 將 JavaScript 值轉換為 JavaScript 對象的表達式(JSON) 字符串 與 JSON.parse作用相反
語法: JSON.stringify(value, [,replacer] [,space])
參數:
   value: 必需,通常為需要轉換的JavaScript值(通常為對象或者數組)
  replacer: 可選,用於轉換結果的函數或者數組
  space: 可選。向返回值 JSON 文本添加縮進、空格和換行符以使其更易於讀取。
返回值:一個包含JSON文本的字符串
var json = {"name":"GDT","age":23,"University":"GDUT"} var info = JSON.stringify(json) // 解析為JSON字符串
console.log(info) // 結果 {"name":"GDT","age":23,"University":"GDUT"} 
console.log(typeof info) // string
 
JSON.parse(JSON.stringify(row)) 可以結合使用
JSON.parse(JSON.stringify(obj))我們一般用來深拷貝,其過程說白了 就是利用JSON.stringify 將js對象序列化(JSON字符串),再使用JSON.parse來反序列化(還原)js對象;序列化的作用是存儲(對象本身存儲的只是一個地址映射,如果斷電,對象將不復存在,因此需將對象的內容轉換成字符串的形式再保存在磁盤上 )和傳輸(例如 如果請求的Content-Typeapplication/x-www-form-urlencoded,則前端這邊需要使用qs.stringify(data)來序列化參數再傳給后端,否則后端接受不到; ps: Content-Typeapplication/json;charset=UTF-8或者 multipart/form-data 則可以不需要 );我們在使用 JSON.parse(JSON.stringify(xxx))時應該注意一下幾點:
 
1、如果obj里面有時間對象,則JSON.stringify后再JSON.parse的結果,時間將只是字符串的形式。而不是時間對象;
2、如果obj里有RegExp、Error對象,則序列化的結果將只得到空對象;
3、如果obj里有函數,undefined,則序列化的結果會把函數或 undefined丟失
4、如果obj里有NaN、Infinity和-Infinity,則序列化的結果會變成null
5、JSON.stringify()只能序列化對象的可枚舉的自有屬性,例如 如果obj中的對象是有構造函數生成的, 則使用JSON.parse(JSON.stringify(obj))深拷貝后,會丟棄對象的constructor
6、如果對象中存在循環引用的情況也無法正確實現深拷貝
 
淺拷貝
//淺拷貝,雙向改變,指向同一片內存空間
var arr1 = [1, 2, 3];
var arr2 = arr1;
arr1[0] = 'change';
console.log('shallow copy: ' + arr1 + " );   //shallow copy: change,2,3
console.log('shallow copy: ' + arr2 + " );   //shallow copy: change,2,3
 
 
eval() 函數
作用:eval() 函數可計算某個字符串,並執行其中的的 JavaScript 代碼。
語法:eval(string)
參數:
  string: 必需,要計算的字符串,其中含有要計算的 JavaScript 表達式或要執行的語句。
返回值:返回計算string的值,如果有的話 (沒有則不做任何改變返回)
 
使用eval()函數也可以將JSON字符串解析為對象,這個功能能完成JSON.parse()的功能,但是有不一樣的地方,請看下面代碼
// JSON.parse()
var json = '{"name":"GDT","age":23,"University":"GDUT"}'; var info = JSON.parse(json);    //解析為JSON對象
document.write(info);            //output為[object Object]

//eval()
var json = '{"name":"GDT","age":23,"University":"GDUT"}'; var info = eval('(' + json + ')');  //解析為JSON對象
document.write(info);            //output為[object Object]
不知道大家有木有注意到eval()還要用一對圓括號將字符串包起來,對此我尋找到比較好的解釋就是:
  原因:歸結於eval本身的問題,由於json是以”{}”的方式來開始以及結束的,在JS中,它會被當成一個語句塊來處理,所以必須強制性的將它轉換成一種表達式。
 
  解決方法:加上圓括號的目的是迫使eval函數在處理JavaScript代碼的時候強制將括號內的表達式(expression)轉化為對象,而不是作為語句(statement)來執行。舉一個例子,例如對象字面量{},如若不加外層的括號,那么eval會將大括號識別為JavaScript代碼塊的開始和結束標記,那么{}將會被認為是執行了一句空語句。
 
 
 
 
 
 
 
 
 
 
 


免責聲明!

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



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