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-Type
是 application/x-www-form-urlencoded
,則前端這邊需要使用qs.stringify(data)
來序列化參數再傳給后端,否則后端接受不到; ps: Content-Type
為 application/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代碼塊的開始和結束標記,那么{}將會被認為是執行了一句空語句。