前端使用JSON.stringify實(shí)現(xiàn)深拷貝的巨坑詳解
時(shí)間類型變成字符串類型數(shù)據(jù)
當(dāng)對(duì)象中有時(shí)間類型的元素時(shí)候-----時(shí)間類型會(huì)被變成字符串類型數(shù)據(jù)
const obj = {
date:new Date()
}
typeof obj.date === 'object' //true
const objCopy = JSON.parse(JSON.stringify(obj));
typeof objCopy.date === string; //true
然后你就會(huì)驚訝的發(fā)現(xiàn),getTime()調(diào)不了了,getYearFull()也調(diào)不了了。就所有時(shí)間類型的內(nèi)置方法都調(diào)不動(dòng)了。
但,string類型的內(nèi)置方法全能調(diào)了。
undefined和function直接丟失
當(dāng)對(duì)象中有undefined類型或function類型的數(shù)據(jù)時(shí) --- undefined和function會(huì)直接丟失
const obj = {
undef: undefined,
fun: () => { console.log('嘰里呱啦,阿巴阿巴') }
}
console.log(obj,"obj");
const objCopy = JSON.parse(JSON.stringify(obj));
console.log(objCopy,"objCopy")

然后你就會(huì)發(fā)現(xiàn),這兩種類型的數(shù)據(jù)都沒了。
變成null
當(dāng)對(duì)象中有NaN、Infinity和-Infinity這三種值的時(shí)候 --- 會(huì)變成null
1.7976931348623157E+10308 是浮點(diǎn)數(shù)的最大上線 顯示為Infinity
-1.7976931348623157E+10308 是浮點(diǎn)數(shù)的最小下線 顯示為-Infinity
const obj = {
nan:NaN,
infinityMax:1.7976931348623157E+10308,
infinityMin:-1.7976931348623157E+10308,
}
console.log(obj, "obj");
const objCopy = JSON.parse(JSON.stringify(obj));
console.log(objCopy,"objCopy")

當(dāng)對(duì)象循環(huán)引用的時(shí)候 --會(huì)報(bào)錯(cuò)
const obj = {
objChild:null
}
obj.objChild = obj;
const objCopy = JSON.parse(JSON.stringify(obj));
console.log(objCopy,"objCopy")

假如你有幸需要拷貝這么一個(gè)對(duì)象 ↓
const obj = {
nan:NaN,
infinityMax:1.7976931348623157E+10308,
infinityMin:-1.7976931348623157E+10308,
undef: undefined,
fun: () => { console.log('嘰里呱啦,阿巴阿巴') },
date:new Date,
}
然后你就會(huì)發(fā)現(xiàn),好家伙,沒一個(gè)正常的。
你還在使用JSON.stringify()來實(shí)現(xiàn)深拷貝嗎?
如果還在使用的話,小心了。作者推薦以后深拷貝使用遞歸的方式進(jìn)行深拷貝。
javascript高級(jí)篇之實(shí)現(xiàn)深拷貝的四種方式
這篇文章里面有封裝好的可以進(jìn)行深拷貝的遞歸函數(shù),筆友可以自取。
總結(jié)
- 對(duì)象中有時(shí)間類型的時(shí)候,序列化之后會(huì)變成字符串類型。
- 對(duì)象中有undefined和Function類型數(shù)據(jù)的時(shí)候,序列化之后會(huì)直接丟失。
- 對(duì)象中有NaN、Infinity和-Infinity的時(shí)候,序列化之后會(huì)顯示null。
- 對(duì)象循環(huán)引用的時(shí)候,會(huì)直接報(bào)錯(cuò)。
- 最后,深拷貝建議使用遞歸,安全方便。
以上就是JSON.stringify實(shí)現(xiàn)深拷貝的巨坑詳解的詳細(xì)內(nèi)容,更多關(guān)于JSON.stringify深拷貝的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
JS實(shí)現(xiàn)輸入框提示文字點(diǎn)擊時(shí)消失效果
這篇文章主要介紹了JS實(shí)現(xiàn)輸入框提示文字點(diǎn)擊時(shí)消失效果,涉及javascript針對(duì)鼠標(biāo)的響應(yīng)及事件監(jiān)聽機(jī)制相關(guān)技巧,需要的朋友可以參考下2016-07-07
頁(yè)面實(shí)時(shí)更新時(shí)間的JS實(shí)例代碼
這篇文章主要介紹了頁(yè)面實(shí)時(shí)更新時(shí)間的JS實(shí)例代碼,有需要的朋友可以參考一下2013-12-12
JavaScript new對(duì)象的四個(gè)過程實(shí)例淺析
這篇文章主要介紹了JavaScript new對(duì)象的四個(gè)過程,結(jié)合實(shí)例形式簡(jiǎn)單分析了javascript面向?qū)ο蟪绦蛟O(shè)計(jì)中new對(duì)象的四個(gè)過程相關(guān)原理與實(shí)現(xiàn)方法,需要的朋友可以參考下2018-07-07
three.js實(shí)現(xiàn)3D模型展示的示例代碼
本篇文章主要介紹了three.js實(shí)現(xiàn)3D模型展示的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-12-12
引入autocomplete組件時(shí)JS報(bào)未結(jié)束字符串常量錯(cuò)誤
在引入jQuery的autocomplete組件時(shí),遇到j(luò)s報(bào)未結(jié)束字符串常量錯(cuò)誤,原因及解決方法如下,大家可以參考下2014-03-03
JS定時(shí)器實(shí)現(xiàn)數(shù)值從0到10來回變化
最近做項(xiàng)目遇到一需求要求實(shí)現(xiàn)數(shù)值從0到10來回變化,下面小編給大家分享下實(shí)現(xiàn)代碼,需要的朋友參考下2016-12-12

