# 值
把對象視為值的組合時,可以使對象序列化成一個字符串,這個字符串包含著對象的結構。
而反序列化就是,讓一個包含著對象結構的字符串作為依據,構造出一個新的對象。
在ES中可以用JSON.stringify和JSON.parse進行序列化和反序列化。
~~~
var foo = {};
foo.bool = true;
foo.str = 'ES';
foo.num = 2017;
var fooStr = JSON.stringify(foo);
console.dir(fooStr);//{"bool":true,"str":"ES","num":2017}
var newObj = JSON.parse(fooStr);
console.dir(newObj.bool);//true
console.dir(newObj.str);//"ES"
console.dir(newObj.num);//2017
console.dir(foo == newObj);//false
~~~
# 引用
引用值也是值,在對象序列化時,遇到引用值,會將引用的對象包含在里面進行序列化。
所以序列化和反序列化可以應用于嵌套的對象結構。
~~~
var objA = {};
objA.num = 0;
var objB = {};
objB.foo = objA;
console.dir(JSON.stringify(objB));//{"foo":{"num":0}}
~~~
# 對象的結構
對象有兩種基礎結構,字典和數組。
他們序列化的內容也存在差異。
~~~
var obj = new Object();//var obj = {};
obj["key"] = "value";
var arr = new Array();//var arr = [];
arr.push("v0");
arr.push("v1");
arr.push("v2");
console.dir(JSON.stringify(obj));//{"key":"vaule"}
console.dir(JSON.stringify(arr));//["v0","v1","v2"]
~~~
簡單來說,字典是以任意值做索引的集合,數組是以數字做索引的集合,他們有著不一樣的用途和實現。