# 值
把对象视为值的组合时,可以使对象序列化成一个字符串,这个字符串包含着对象的结构。
而反序列化就是,让一个包含着对象结构的字符串作为依据,构造出一个新的对象。
在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"]
~~~
简单来说,字典是以任意值做索引的集合,数组是以数字做索引的集合,他们有着不一样的用途和实现。