- 如果obj里面有時(shí)間對(duì)象,則JSON.stringify后再JSON.parse的結(jié)果轿钠,時(shí)間將只是字符串的形式巢钓,而不是對(duì)象的形式
var t = {time: new Date()};
var t2 = JSON.parse(JSON.stringify(t));
console.log(t,t2)
- 如果obj里有RegExp(正則表達(dá)式的縮寫)、Error對(duì)象疗垛,則序列化的結(jié)果將只得到空對(duì)象症汹;
var r = {a: /^name.+/, b:2, c: new Error('錯(cuò)誤'), d: new RegExp('\\w+')};
var r2 = JSON.parse(JSON.stringify(r));
console.log(r, r2)
- 如果obj里有函數(shù),undefined贷腕,則序列化的結(jié)果會(huì)把函數(shù)或 undefined丟失烈菌;
var q = {fn: function(){}, u: undefined, i: null, g: ''};
var q2 = JSON.parse(JSON.stringify(q));
console.log(q, q2)
- 如果obj里有NaN、Infinity和-Infinity花履,則序列化的結(jié)果會(huì)變成null
var w = {a: NaN, b: Infinity, c: -Infinity, d: 3};
var w2 = JSON.parse(JSON.stringify(w));
console.log(w, w2)
- JSON.stringify()只能序列化對(duì)象的可枚舉的自有屬性,例如 如果obj中的對(duì)象是有構(gòu)造函數(shù)生成的挚赊, 則使用JSON.parse(JSON.stringify(obj))深拷貝后诡壁,會(huì)丟棄對(duì)象的constructor;
function Person(name){this.name=name};
Person.prototype.age= 14;
var p = new Person('zs');
var o = {a: p};
var o2 = JSON.parse(JSON.stringify(o));
console.log(o ,o2)
- 如果對(duì)象中存在循環(huán)引用的情況也無法正確實(shí)現(xiàn)深拷貝荠割;
var a = {};a.b=a;
通俗點(diǎn)說妹卿,JSON.parse(JSON.stringfy(X)),其中X只能是Number, String, Boolean, Array, 扁平對(duì)象蔑鹦,即那些能夠被 JSON 直接表示的數(shù)據(jù)結(jié)構(gòu)夺克。