詳解JavaScript對(duì)象序列化
一.什么是對(duì)象序列化?
對(duì)象序列化是指將對(duì)象的狀態(tài)轉(zhuǎn)換為字符串(來(lái)自我這菜鳥(niǎo)的理解,好像有些書上也是這么說(shuō)的,淺顯易懂!);
序列化(Serialization)是將對(duì)象的狀態(tài)信息轉(zhuǎn)換為可以存儲(chǔ)或傳輸?shù)男问降倪^(guò)程(來(lái)自“百度百科—序列化“,學(xué)術(shù)性強(qiáng),略顯高端);
二.為什么會(huì)有對(duì)象序列化?
世間萬(wàn)物,都有其存在的原因。為什么會(huì)有對(duì)象序列化呢?因?yàn)槌绦蛟硞冃枰?。既然是?duì)象序列化,那我們就先從一個(gè)對(duì)象說(shuō)起:
var obj = {x:1, y:2};
當(dāng)這句代碼運(yùn)行時(shí),對(duì)象obj的內(nèi)容會(huì)存儲(chǔ)在一塊內(nèi)存中,而obj本身存儲(chǔ)的只是這塊內(nèi)存的地址的映射而已。簡(jiǎn)單的說(shuō),對(duì)象obj就是我們的程序在電腦通電時(shí)在內(nèi)存中維護(hù)的一種東西,如果我們程序停止了或者電腦斷電了,對(duì)象obj將不復(fù)存在。那么如何把對(duì)象obj的內(nèi)容保存在磁盤上呢(也就是說(shuō)在沒(méi)電時(shí)繼續(xù)保留著)?這時(shí)就需要把對(duì)象obj序列化,也就是說(shuō)把obj的內(nèi)容轉(zhuǎn)換成一個(gè)字符串的形式,然后再保存在磁盤上。另外,我們又怎么通過(guò)HTTP協(xié)議把對(duì)象obj的內(nèi)容發(fā)送到客戶端呢?沒(méi)錯(cuò),還是需要先把對(duì)象obj序列化,然后客戶端根據(jù)接收到的字符串再反序列化(也就是將字符串還原為對(duì)象)解析出相應(yīng)的對(duì)象。這也正是”百度百科—序列化“中描述的兩個(gè)作用——存儲(chǔ)、傳輸。
三.JavaScript中的對(duì)象序列化
JSON的全稱是”JavaScript Object Notation“——JavaScript對(duì)象表示法。ECMAScript 5中提供了內(nèi)置函數(shù)JSON.stringify()和JSON.parse()用來(lái)序列化和還原JavaScript對(duì)象。它們使用起來(lái)也很簡(jiǎn)單:
可以看到,exampleStr和exampleObj2中并沒(méi)有 y:undefined 的內(nèi)容。這說(shuō)明:JSON的語(yǔ)法是JavaScript語(yǔ)法的子集,它并不能表示JavaScript中的所有值,對(duì)于JSON語(yǔ)法不支持的屬性,序列化后會(huì)將其省略。其詳細(xì)規(guī)則如下:
- ①對(duì)于JavaScript中的五種原始類型,JSON語(yǔ)法支持?jǐn)?shù)字、字符串、布爾值、null四種,不支持undefined;
- ②NaN、Infinity和-Infinity序列化的結(jié)果是null;
- ③JSON語(yǔ)法不支持函數(shù);
- ④除了RegExp、Error對(duì)象,JSON語(yǔ)法支持其他所有對(duì)象;
- ⑤日期對(duì)象序列化的結(jié)果是ISO格式的字符串,但JSON.parse()依然保留它們字符串形態(tài),并不會(huì)將其還原為日期對(duì)象;
- ⑥JSON.stringify()只能序列化對(duì)象的可枚舉的自有屬性;
從上面的例子也可以看到,在符合以上規(guī)則的情況下,還可以通過(guò)對(duì)象序列化和反序列化完成對(duì)象的深拷貝。
以上就是JSON.stringify()和JSON.parse()的常用用法了,但這兩個(gè)方法并不止這么簡(jiǎn)單:
四.完整版JSON.stringify()
1.簡(jiǎn)介
序列化原始值、對(duì)象或數(shù)組
2.概要
JSON.stringify(o[, filter][, indent])
3.參數(shù)
o,要轉(zhuǎn)換成JSON字符串的原始值、對(duì)象或數(shù)組
filter,可選參數(shù),一個(gè)數(shù)組或函數(shù)
indent,可選參數(shù),一個(gè)數(shù)值或一個(gè)字符串
4.返回
JSON格式的字符串,代表o的值,同時(shí)通過(guò)了filter的過(guò)濾,以及根據(jù)indent進(jìn)行了格式化
5.描述
①當(dāng)對(duì)象o自身帶有toJSON()方法時(shí),JSON.stringify()會(huì)調(diào)用o的toJSON()方法,并使用該方法的返回值而不是該對(duì)象本身進(jìn)行字符串化;
?、谌绻鹒ilter存在且是一個(gè)函數(shù),那么該函數(shù)的返回值將會(huì)作為JSON.stringify()方法的返回值。并且該函數(shù)接收兩個(gè)參數(shù),第一個(gè)參數(shù)是一個(gè)空字符串,第二個(gè)參數(shù)就是對(duì)象o。
③如果filter存在且是一個(gè)字符串?dāng)?shù)組(如果數(shù)組中包含數(shù)字,數(shù)字會(huì)自動(dòng)轉(zhuǎn)化為字符串),那么對(duì)象o的某些屬性名如果不在這個(gè)數(shù)組中,則序列化時(shí)會(huì)將這些屬性省略,且返回的字符串中屬性的順序會(huì)與該數(shù)組中屬性的順序一致;
?、躂SON.stringify()返回的通常是不帶任何空格或換行符的字符串。如果想輸出可讀性更好的字符串,需要指定第三個(gè)參數(shù)。如果指定的第三個(gè)參數(shù)是介于1~10之間的值,則JSON.stringify()會(huì)在每一“層級(jí)”的輸出插入換行符和指定個(gè)數(shù)的空格。如果指定的第三個(gè)參數(shù)是非空字符串,則JSON.stringify()會(huì)插入換行符和該字符串(只取前十個(gè)字符)來(lái)縮進(jìn)層級(jí);
五.完整版JSON.parse()
1.簡(jiǎn)介
解析JSON格式的字符串
2.概要
JSON.parse(s[, reviver])
3.參數(shù)
s,要解析的字符串
reviver,可選參數(shù),用來(lái)轉(zhuǎn)換解析值的可選函數(shù)
4.返回
一個(gè)對(duì)象、數(shù)組或原始值。該返回值是從s中解析的(還有可能被reviver修改過(guò));
5.描述
?、偃绻付藃eviver函數(shù),該函數(shù)會(huì)為從s中解析的每一個(gè)原始值(不是包含這些原始值的對(duì)象或數(shù)組)調(diào)用一次。調(diào)用reviver時(shí)帶有兩個(gè)參數(shù),第一個(gè)參數(shù)是屬性名——對(duì)象的屬性名或轉(zhuǎn)換成字符串的數(shù)組序號(hào),第二個(gè)參數(shù)是對(duì)象屬性或數(shù)組元素的原始值。并且,reviver函數(shù)的返回值將作為JSON.parse()的返回值;
以上就是關(guān)于JavaScript對(duì)象序列化的相關(guān)內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助。
相關(guān)文章
JavaScript對(duì)象訪問(wèn)器Getter及Setter原理解析
這篇文章主要介紹了JavaScript對(duì)象訪問(wèn)器Getter及Setter原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-12-12JavaScript中的16進(jìn)制字符(改進(jìn))
后來(lái)經(jīng)過(guò)自己的測(cè)試,發(fā)現(xiàn)將字符轉(zhuǎn)換為十六進(jìn)制的方法不完善。2011-11-11JS實(shí)現(xiàn)靜止元素自動(dòng)移動(dòng)示例
這篇文章主要介紹了JS實(shí)現(xiàn)靜止元素自動(dòng)移動(dòng)的具體實(shí)現(xiàn),需要的朋友可以參考下2014-04-04微信提示 在瀏覽器打開(kāi) 效果實(shí)現(xiàn)過(guò)程解析
這篇文章主要介紹了微信提示 在瀏覽器打開(kāi) 效果實(shí)現(xiàn)過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09如何實(shí)現(xiàn)JavaScript動(dòng)態(tài)加載CSS和JS文件
這篇文章主要為大家詳細(xì)介紹了JavaScript動(dòng)態(tài)加載CSS和JS文件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2015-10-10