一.什麼是對象序列化?git
對象序列化是指將對象的狀態轉換爲字符串(來自我這菜鳥的理解,好像有些書上也是這麼說的,淺顯易懂!);github
序列化(Serialization)是將對象的狀態信息轉換爲能夠存儲或傳輸的形式的過程(來自「百度百科—序列化「,學術性強,略顯高端);json
二.爲何會有對象序列化?數組
世間萬物,都有其存在的緣由。爲何會有對象序列化呢?由於程序猿們須要它。既然是對象序列化,那咱們就先從一個對象提及:函數
var obj = {x:1, y:2};
當這句代碼運行時,對象obj的內容會存儲在一塊內存中,而obj自己存儲的只是這塊內存的地址的映射而已。簡單的說,對象obj就是咱們的程序在電腦通電時在內存中維護的一種東西,若是咱們程序中止了或者電腦斷電了,對象obj將不復存在。那麼如何把對象obj的內容保存在磁盤上呢(也就是說在沒電時繼續保留着)?這時就須要把對象obj序列化,也就是說把obj的內容轉換成一個字符串的形式,而後再保存在磁盤上。另外,咱們又怎麼經過HTTP協議把對象obj的內容發送到客戶端呢?沒錯,仍是須要先把對象obj序列化,而後客戶端根據接收到的字符串再反序列化(也就是將字符串還原爲對象)解析出相應的對象。這也正是」百度百科—序列化「中描述的兩個做用——存儲、傳輸。spa
三.JavaScript中的對象序列化code
JSON的全稱是」JavaScript Object Notation「——JavaScript對象表示法。ECMAScript 5中提供了內置函數JSON.stringify()和JSON.parse()用來序列化和還原JavaScript對象。它們使用起來也很簡單:對象
能夠看到,exampleStr和exampleObj2中並無 y:undefined 的內容。這說明:JSON的語法是JavaScript語法的子集,它並不能表示JavaScript中的全部值,對於JSON語法不支持的屬性,序列化後會將其省略。其詳細規則以下:blog
①對於JavaScript中的五種原始類型,JSON語法支持數字、字符串、布爾值、null四種,不支持undefined;ip
②NaN、Infinity和-Infinity序列化的結果是null;
③JSON語法不支持函數;
④除了RegExp、Error對象,JSON語法支持其餘全部對象;
⑤日期對象序列化的結果是ISO格式的字符串,但JSON.parse()依然保留它們字符串形態,並不會將其還原爲日期對象;
⑥JSON.stringify()只能序列化對象的可枚舉的自有屬性;
從上面的例子也能夠看到,在符合以上規則的狀況下,還能夠經過對象序列化和反序列化完成對象的深拷貝(什麼是對象的深拷貝?能夠去看:https://www.zhihu.com/question/23031215,鄒潤陽的答案)。
以上就是JSON.stringify()和JSON.parse()的經常使用用法了,但這兩個方法並不止這麼簡單:
四.完整版JSON.stringify()
1.簡介
序列化原始值、對象或數組
2.概要
JSON.stringify(o[, filter][, indent])
3.參數
o,要轉換成JSON字符串的原始值、對象或數組
filter,可選參數,一個數組或函數
indent,可選參數,一個數值或一個字符串
4.返回
JSON格式的字符串,表明o的值,同時經過了filter的過濾,以及根據indent進行了格式化
5.描述
①當對象o自身帶有toJSON()方法時,JSON.stringify()會調用o的toJSON()方法,並使用該方法的返回值而不是該對象自己進行字符串化;
②若是filter存在且是一個函數,那麼該函數的返回值將會做爲JSON.stringify()方法的返回值。而且該函數接收兩個參數,第一個參數是一個空字符串,第二個參數就是對象o。這裏,你們也能夠參考Douglas Crockford爲 ES3 環境使用JSON寫的json2:https://github.com/douglascrockford/JSON-js/blob/master/json2.js#L427。看看JSON.stringify和str的實現應該就明白我這裏所說的這兩個參數的具體含義了;
③若是filter存在且是一個字符串數組(若是數組中包含數字,數字會自動轉化爲字符串),那麼對象o的某些屬性名若是不在這個數組中,則序列化時會將這些屬性省略,且返回的字符串中屬性的順序會與該數組中屬性的順序一致;
④JSON.stringify()返回的一般是不帶任何空格或換行符的字符串。若是想輸出可讀性更好的字符串,須要指定第三個參數。若是指定的第三個參數是介於1~10之間的值,則JSON.stringify()會在每一「層級」的輸出插入換行符和指定個數的空格。若是指定的第三個參數是非空字符串,則JSON.stringify()會插入換行符和該字符串(只取前十個字符)來縮進層級;
五.完整版JSON.parse()
1.簡介
解析JSON格式的字符串
2.概要
JSON.parse(s[, reviver])
3.參數
s,要解析的字符串
reviver,可選參數,用來轉換解析值的可選函數
4.返回
一個對象、數組或原始值。該返回值是從s中解析的(還有可能被reviver修改過);
5.描述
①若是指定了reviver函數,該函數會爲從s中解析的每個原始值(不是包含這些原始值的對象或數組)調用一次。調用reviver時帶有兩個參數,第一個參數是屬性名——對象的屬性名或轉換成字符串的數組序號,第二個參數是對象屬性或數組元素的原始值(若是對於這裏說的兩個參數有疑惑,仍是能夠參考:https://github.com/douglascrockford/JSON-js/blob/master/json2.js#L460)。而且,reviver函數的返回值將做爲JSON.parse()的返回值;