缺点: 无法拷贝函数和undefined值。 无法正确处理特殊对象类型(如Date、RegExp等)。 可能造成数字精度损失。 无法处理循环引用。 丢失原型链上的方法和属性。 适用场景: 仅适用于处理简单的纯数据对象。 在性能开销和数据完整性要求不高的场景下可以使用。 对于需要深拷贝复杂对象或处理特殊数据类型的场景,建议使用更...
如果对象中存在循环引用(即对象 A 引用了对象 B,而对象 B 又反过来引用了对象 A),使用 JSON.parse(JSON.stringify(obj)) 会导致错误,因为 JSON 格式不允许循环引用。 丢失原型信息 这种方法生成的新对象失去了原始对象的原型信息,这可能在某些场景下导致问题,尤其是当对象的方法依赖于原型链时。 性能问题 在处理...
1、如果obj里面有时间对象,则JSON.stringify后再JSON.parse的结果,时间将只是字符串的形式。而不是时间对象; 1 2 3 4 5 6 7 vartest = { name:'a', date: [newDate(1536627600000),newDate(1540047600000)], }; letb; b = JSON.parse(JSON.stringify(test)) 2、如果obj里有RegExp、Error对象,则序列...
大部分情况我们都可以使用JSON.parse(JSON.stringify(object))来实现深拷贝,但该方法也有局限性,如下: 会忽略undefined 会忽略symbol 不能序列化函数 不能解决循环引用的对象 例如: let a ={ age: undefined, sex: Symbol('male'), jobs:function() {}, name:'yck'} let b=JSON.parse(JSON.stringify(a))...
2 如果obj里面存在时间对象,JSON.parse(JSON.stringify(obj))之后,时间对象变成了字符串。 3 如果对象中存在循环引用的情况也无法正确实现深拷贝。 4 如果obj里有NaN、Infinity和-Infinity,则序列化的结果会变成null。 5 如果obj里有RegExp、Error对象,则序列化的结果将只得到空对象。
JSON.parse,JSON.stringify 深浅拷贝的缺陷 经常使用 JSON.parse, JSON.stringify 的小伙伴都知道,他们两个可以用于深拷贝对象,但是可能会不太注意一些缺陷,是又一次我使用他们去深拷贝对象,我发现有些属性莫名其妙的丢失了,之前没有太深究其弊端,今天趁着有空深究一下这些弊端。
首先,让我们通过一个简单的示例来了解可能的缺陷。假设我们有一个自定义对象,包含一些属性和方法。当我们尝试使用JSON.stringify将此对象序列化为JSON字符串,然后使用JSON.parse将JSON字符串反序列化回JavaScript对象时,虽然表面上看起来对象的结构得以保留,但实际上某些属性可能并未正确复制。这可能是由于...
log("run") } Object.defineProperty(KenNaNa.prototype, "contructor", { value: KenNaNa, enumerable:false }) let kenNaNa = new KenNaNa() let copyKenNaNa = JSON.parse(JSON.stringify(kenNaNa)) /** Ken {age: "18", run: ƒ, contructor: ƒ} * */ console.log(copyKenNaNa.constructor)...
console.log(objCopy.p1.__proto__.constructor === Object); // true } 6.如果对象中存在循环引用的情况也无法实现深拷贝 { let obj = { age: 18 }; obj.obj = obj; let objCopy = JSON.parse(JSON.stringify(obj)); console.log('obj', obj); ...
一个数组添加属性,深拷贝之后添加的数据丢失 当数组添加一个对象,这个对象是不可枚举属性,使用JSON进行深拷贝,会丢失这个属性 使用JSON.parse(JSON.stringify())进行深拷贝 有哪些弊端 如果obj里有函数,undefined,则序列化的结果会把函数, undefined丢失