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

然后你就會發(fā)現(xiàn),這兩種類型的數(shù)據(jù)都沒了。
變成null
當(dāng)對象中有NaN、Infinity和-Infinity這三種值的時候 --- 會變成null
1.7976931348623157E+10308 是浮點數(shù)的最大上線 顯示為Infinity
-1.7976931348623157E+10308 是浮點數(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)對象循環(huán)引用的時候 --會報錯
const obj = {
objChild:null
}
obj.objChild = obj;
const objCopy = JSON.parse(JSON.stringify(obj));
console.log(objCopy,"objCopy")

假如你有幸需要拷貝這么一個對象 ↓
const obj = {
nan:NaN,
infinityMax:1.7976931348623157E+10308,
infinityMin:-1.7976931348623157E+10308,
undef: undefined,
fun: () => { console.log('嘰里呱啦,阿巴阿巴') },
date:new Date,
}
然后你就會發(fā)現(xiàn),好家伙,沒一個正常的。
你還在使用JSON.stringify()來實現(xiàn)深拷貝嗎?
如果還在使用的話,小心了。作者推薦以后深拷貝使用遞歸的方式進(jìn)行深拷貝。
javascript高級篇之實現(xiàn)深拷貝的四種方式
這篇文章里面有封裝好的可以進(jìn)行深拷貝的遞歸函數(shù),筆友可以自取。
總結(jié)
- 對象中有時間類型的時候,序列化之后會變成字符串類型。
- 對象中有undefined和Function類型數(shù)據(jù)的時候,序列化之后會直接丟失。
- 對象中有NaN、Infinity和-Infinity的時候,序列化之后會顯示null。
- 對象循環(huán)引用的時候,會直接報錯。
- 最后,深拷貝建議使用遞歸,安全方便。
以上就是JSON.stringify實現(xiàn)深拷貝的巨坑詳解的詳細(xì)內(nèi)容,更多關(guān)于JSON.stringify深拷貝的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
引入autocomplete組件時JS報未結(jié)束字符串常量錯誤
在引入jQuery的autocomplete組件時,遇到j(luò)s報未結(jié)束字符串常量錯誤,原因及解決方法如下,大家可以參考下2014-03-03

