当原对象中有这两个时,拷贝后这两种类型的数据直接丢失
var num={ name:"小姜", age:"18", gender:undefined, function(){ console.log("这是一个函数"); } } var numCopy=JSON.parse(JSON.stringify(num)) console.log("原对象") console.log(num) console.log("拷贝后的对象") console.log(numCopy)
控制台输出:
从控制台结果可以看出undefined和函数function在拷贝过程中丢失了。
var time={ Date:new Date() } var timeCopy=JSON.parse(JSON.stringify(time)) console.log("原对象") console.log(time.Date.getFullYear()+"----"+time.Date.getTime()) console.log() console.log("拷贝后的对象") console.log(timeCopy.Date.getFullYear()+"----"+timeCopy.Date.getTime())
从控制台结果可以看出上面几个关于时间的几个内置方法无法使用了。
var num={ one:NaN, two:Infinity, three:-Infinity, } var numCopy=JSON.parse(JSON.stringify(num)) console.log("原对象") console.log(num) console.log("拷贝后的对象") console.log(numCopy)
控制台输出:
通过控制台可以看到当对象中存在NaN,Infinity,-Infinity时,拷贝后会使他们统一变成null.
如果原始对象中存在循环引用,即对象的某个属性引用了该对象本身,使用该方法就会抛出异常。
var num={ a:"小姜", b:"小刘", } num.c=num console.log("原对象") console.log(num) console.log("拷贝后的对象") var numCopy=JSON.parse(JSON.stringify(num)) console.log(numCopy)
控制台输出:
在控制台中可以看到此时使用该方法就会抛出TypeError异常.
如果原始对象的某个属性是通过原型链接继承的,那么使用该方法得到的新对象会丢失该属性。
function People(){ name:"小姜"; } People.prototype.name="小刘"; var People1=new People(); var peopleCopy=JSON.parse(JSON.stringify(People1)); console.log("原对象") console.log(People1.name) console.log("拷贝后对象") console.log(peopleCopy.name)
控制台输出:
由控制台看出得到的新对象属性丢失。
总结来说,JSON.parse(JSON.stringify())实现深拷贝比较简单,但是同时也存在许多缺点。我们可以使用利用递归函数实现进行深拷贝。
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- bangwoyixia.com 版权所有 湘ICP备2023022004号-2
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务