javascript深拷贝的原理与实现方法分析
程序员文章站
2022-05-15 08:17:19
本文实例讲述了javascript深拷贝的原理与实现方法。分享给大家供大家参考,具体如下:
要讲javascript的拷贝,就得先讲讲javascript中的值传递和引用...
本文实例讲述了javascript深拷贝的原理与实现方法。分享给大家供大家参考,具体如下:
要讲javascript的拷贝,就得先讲讲javascript中的值传递和引用传递。
javascript中没有一个具体的语法来规定哪些参数是引用传递,而其他语言中都有明文规定,比如 c# 中的 ref 和 php 中的 & 。
这也是javascript众多弊端中的一个。
我们先看看下面这段代码:
//值传递 var i = 3; var j = i; j = 4; document.write(i);//3 //引用传递 var m = [1]; var n = m; n[0] = 2; document.write(n[0]);//2
说明,javascript中只有简单类型是值传递,而其他复杂类型比如数组、对象都是默认就是引用传递的。
那么我们如果需要复制一个对象呢?就必须自己定义方法:
//深度拷贝函数,其实就是值传递 function cloneobject(srcobj){ var tarobj=new object(); for(var key in srcobj){//判断对象中是否继续为对象 tarobj[key]=typeof srcobj[key]==='object'?cloneobject(srcobj[key]):srcobj[key]; } return tarobj; } //验证深度拷贝函数的使用 // 测试用例: var srcobj = { a: 1, b: { b1: ["hello", "hi"], b2: "javascript" } }; var abobj = srcobj;//引用传递 var tarobj = cloneobject(srcobj); srcobj.a = 2; srcobj.b.b1[0] = "hello"; console.log(abobj.a);//2 console.log(abobj.b.b1[0]);//hello,说明普通的=是一种引用传递 console.log(tarobj.a); // 1 console.log(tarobj.b.b1[0]); // "hello",说明我们定义的深拷贝是值传递
其实就是通过实例化一个新的对象,从而在堆中开辟一块新的内存空间,使得栈中的变量名指向堆中的新内容。
更多关于javascript相关内容可查看本站专题:《javascript面向对象入门教程》、《javascript中json操作技巧总结》、《javascript切换特效与技巧总结》、《javascript查找算法技巧总结》、《javascript动画特效与技巧汇总》、《javascript错误与调试技巧总结》、《javascript数据结构与算法技巧总结》、《javascript遍历算法与技巧总结》及《javascript数学运算用法总结》
希望本文所述对大家javascript程序设计有所帮助。
推荐阅读
-
JavaScript观察者模式(publish/subscribe)原理与实现方法
-
JavaScript中的浅拷贝与深拷贝-前端爬坑-SegmentFault思否
-
C#中序列化实现深拷贝,实现DataGridView初始化刷新的方法
-
PHP迭代器和迭代的实现与使用方法分析
-
深入解析JS实现3D标签云的原理与方法
-
JavaScript实现京东购物放大镜和选项卡效果的方法分析
-
详解java中的深拷贝和浅拷贝(clone()方法的重写、使用序列化实现真正的深拷贝)
-
JavaScript 复制对象与Object.assign方法无法实现深复制
-
JS浅拷贝和深拷贝原理与实现方法分析
-
JavaScript实现图片懒加载的方法分析