欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

javascript深拷贝的原理与实现方法分析

程序员文章站 2022-11-22 09:54:57
本文实例讲述了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程序设计有所帮助。