javascript中浅拷贝和深拷贝的理解

什么是拷贝?

简单地说就是复制,对数据的复制

浅拷贝:改变拷贝者的值,被拷贝者的值也会变化

深拷贝:改变拷贝者的值,被拷贝者的值不会变化

由于基本数据类型是存放在栈中,拷贝的就是自己本身,所以就是深拷贝

1:number

var a = 1;
b = a;
console.log(a);//1
console.log(b);//1
b = 2;
console.log(a);//1
console.log(b);//2

2:string

var a = "hello";
b = a;
console.log(a);//hello
console.log(b);//hello
b = "world";
console.log(a);//hello
console.log(b);//world

3:boolean

var a = true;
b = a;
console.log(a);//true
console.log(b);//true
b = false;
console.log(a);//true
console.log(b);//false

4:null

var a = null;
b = a;
console.log(a);//null
console.log(b);//null
b = "hello";
console.log(a);//null
console.log(b);//hello

5:undefined

var a = undefined;
b = a;
console.log(a);//undefined
console.log(b);//undefined
b = "hello";
console.log(a);//undefined
console.log(b);//hello

对于引用数据类型,通过复制的形式一般就是浅拷贝

6:Array浅拷贝

复制的只是引用,a和b在栈中是不同的值,但二者在堆中是同一块区域

var a = [1,2,3];
b = a;
console.log(a);//[1,2,3]
console.log(b);//[1,2,3]
b[1] = 4;
console.log(a);//[1,4,3]
console.log(b);//[1,4,3]

7:Array深拷贝

复制的不仅是引用,还有引用值,堆中也未b开辟了一块空间

8:Array深拷贝slice(0)

var a = [1,2,3];
b = a.slice(0);
console.log(a);//[1,2,3]
console.log(b);//[1,2,3]
b[1] = 4;
console.log(a);//[1,2,3]
console.log(b);//[1,4,3]

9:Array深拷贝concat()

var a = [1,2,3];
b = a.concat();
console.log(a);//[1,2,3]
console.log(b);//[1,2,3]
b[1] = 4;
console.log(a);//[1,2,3]
console.log(b);//[1,4,3]

10:Array深拷贝deepCopy()

var a = [1,2,3];
b = [];
deepCopy(a,b)
console.log(a);//[1,2,3]
console.log(b);//[1,2,3]
b[1] = 4;
console.log(a);//[1,2,3]
console.log(b);//[1,4,3]function deepCopy(arr1,arr2){for(var i = 0,L = arr1.length;i<L;i++){arr2[i] = arr1[i]}
}

11:上面三种方法只针对一位数组,对于多维数组有局限性

12:Array多维数组深拷贝deepCopy()

var a = [[1,2,3,4],5,6];
b = [];
deepCopy(a,b)
console.log(a);//[ [ 1, 2, 3, 4 ], 5, 6 ]
console.log(b);//[ [ 1, 2, 3, 4 ], 5, 6 ]
b[0][1] = 7;
b[1] = 8;
console.log(a);//[ [ 1, 7, 3, 4 ], 5, 6 ]
console.log(b);//[ [ 1, 7, 3, 4 ], 8, 6 ]function deepCopy(arr1,arr2){for(var i = 0,L = arr1.length;i<L;i++){arr2[i] = arr1[i]}
}

13:Array多维数组深拷贝slice(0)

var a = [[1,2,3,4],5,6];
b = a.slice(0)
console.log(a);//[ [ 1, 2, 3, 4 ], 5, 6 ]
console.log(b);//[ [ 1, 2, 3, 4 ], 5, 6 ]
b[0][1] = 7;
b[1] = 8;
console.log(a);//[ [ 1, 7, 3, 4 ], 5, 6 ]
console.log(b);//[ [ 1, 7, 3, 4 ], 8, 6 ]

14:Array多维数组深拷贝concat()

var a = [[1,2,3,4],5,6];
b = a.concat()
console.log(a);//[ [ 1, 2, 3, 4 ], 5, 6 ]
console.log(b);//[ [ 1, 2, 3, 4 ], 5, 6 ]
b[0][1] = 7;
b[1] = 8;
console.log(a);//[ [ 1, 7, 3, 4 ], 5, 6 ]
console.log(b);//[ [ 1, 7, 3, 4 ], 8, 6 ]

15:Array多维数组深拷贝deepCopy()优化处理

var a = [[1,2,3,[7,8]],5,6];
b = [];
deepCopy(a,b)
console.log(a);//[ [ 1, 2, 3, [ 7, 8 ] ], 5, 6 ]
console.log(b);//[ [ 1, 2, 3, [ 7, 8 ] ], 5, 6 ]
b[0][1] = 7;
b[0][3][1] = 9;
b[1] = 8;
console.log(a);//[ [ 1, 2, 3, [ 7, 8 ] ], 5, 6 ]
console.log(b);//[ [ 1, 7, 3, [ 7, 9 ] ], 8, 6 ]function deepCopy(arr1,arr2){var tempArr = [];for(var i = 0,L = arr1.length;i<L;i++){if(arr1[i] instanceof Array){deepCopy(arr1[i],tempArr);arr2[i] = tempArr}else {arr2[i] = arr1[i];}}
}

16:对象浅拷贝

var a = {name:"zyb",age:23};
var b = a;
console.log(a)//{ name: 'zyb', age: 23 }
console.log(b);//{ name: 'zyb', age: 23 }a.name = "lisi";
console.log(a)//{ name: 'lisi', age: 23 }
console.log(b);//{ name: 'lisi', age: 23 }

17:对象深拷贝

var a = {name:"zyb",age:23};
var b = new Object();b.name = a.name;
b.age = a.age;
console.log(a)//{ name: 'zyb', age: 23 }
console.log(b);//{ name: 'zyb', age: 23 }a.name = "lisi";
console.log(a)//{ name: 'lisi', age: 23 }
console.log(b);//{ name: 'zyb', age: 23 }

18:对象深拷贝:内嵌对象

var a = {name:"zyb",age:23,list:{goods:"篮球",detail:"运动是好的"
}};
var b = new Object();b.name = a.name;
b.age = a.age;
b.list = a.list;
console.log(a)//{ name: 'zyb', age: 23, list: { goods: '篮球', detail: '运动是好的' } }
console.log(b);//{ name: 'zyb', age: 23, list: { goods: '篮球', detail: '运动是好的' } }a.name = "lisi";
a.list.goods = "足球";
console.log(a)//{ name: 'lisi', age: 23, list: { goods: '足球', detail: '运动是好的' } }
console.log(b);//{ name: 'zyb', age: 23, list: { goods: '足球', detail: '运动是好的' } }

19:对象深拷贝deepCopy()

var a = {name:"zyb",age:23};
var b = deepCopy(a);console.log(a)//{ name: 'zyb', age: 23 }
console.log(b);//{ name: 'zyb', age: 23 }a.name = "lisi";console.log(a)//{ name: 'lisi', age: 23 }
console.log(b);//{ name: 'zyb', age: 23 }function deepCopy(obj){var result = {};for(var key in obj){if(obj.hasOwnProperty(key)){result[key] = typeof obj[key] === 'object' ? deepCopy(obj[key]) : obj[key];}}return result;
}

20:对象深拷贝deepCopy():内嵌对象

var a = {name:"zyb",age:23,list:{goods:"篮球",detail:"运动是好的"
}};
var b = deepCopy(a)console.log(a)//{ name: 'zyb', age: 23, list: { goods: '篮球', detail: '运动是好的' } }
console.log(b);//{ name: 'zyb', age: 23, list: { goods: '篮球', detail: '运动是好的' } }a.name = "lisi";
a.list.goods = "足球";
console.log(a)//{ name: 'lisi', age: 23, list: { goods: '足球', detail: '运动是好的' } }
console.log(b);//{ name: 'zyb', age: 23, list: { goods: '篮球', detail: '运动是好的' } }function deepCopy(obj){var result = {};for(var key in obj){if(obj.hasOwnProperty(key)){result[key] = typeof obj[key] === 'object' ? deepCopy(obj[key]) : obj[key];}}return result;
}

21:jquery中对数组的拷贝

var a = [1,2,3];
var b = $.extend([],a);
console.log(a)//[1,2,3]
console.log(b)//[1,2,3]
b.push(4)
console.log(a)//[1,2,3]
console.log(b)//[1,2,3,4]

22:jquery中对对象的拷贝1

var a = {a1:1,a2:2,a3:3};
var b = $.extend({},a);
console.log(a)//{a1:1,a2:2,a3:3}
console.log(b)//{a1:1,a2:2,a3:3}
b.b4 = 4
console.log(a)//{a1:1,a2:2,a3:3}
console.log(b)//{a1:1,a2:2,a3:3,b4:4}

23:jquery中对对象的拷贝2

var a = {a1:1,a2:2,a3:3};
var b = $.extend({b0:0},a);
console.log(a)//{a1:1,a2:2,a3:3}
console.log(b)//{b0:0,a1:1,a2:2,a3:3}
b.b4 = 4
console.log(a)//{a1:1,a2:2,a3:3}
console.log(b)//{b0:0,a1:1,a2:2,a3:3,b4:4}

24:jquery中对对象的拷贝3

var a = {a1:1,a2:2,a3:3};
var c = {c1:1,c2:2,c3:3};
var b = $.extend({b0:0},a,c);
console.log(a)//{a1:1,a2:2,a3:3}
console.log(b)//{a1:1,a2:2,a3:3,b0:0,c1:1,c2:2,c3:3}
b.b4 = 4
console.log(a)//{a1:1,a2:2,a3:3}
console.log(b)//{a1:1,a2:2,a3:3,b0:0.b4:4,c1:1,c2:2,c3:3}

转载于:https://www.cnblogs.com/bijiapo/p/5546527.html

javascript中浅拷贝和深拷贝的理解相关推荐

  1. Python中浅拷贝和深拷贝的理解与研究

    Python中浅拷贝和深拷贝的理解与研究 单层浅拷贝 import copy a = 1 # 不可变数据类型 copy_a = copy.copy(a) print(id(a),id(copy_a)) ...

  2. Python中浅拷贝和深拷贝的理解与研究 1

    Python中浅拷贝和深拷贝的理解与研究 单层浅拷贝 import copy a = 1 # 不可变数据类型 copy_a = copy.copy(a) print(id(a),id(copy_a)) ...

  3. 关于JavaScript的浅拷贝和深拷贝

    在 JS 中有一些基本类型像是Number.String.Boolean,而对象就是像这样的东西{ name: 'Larry', skill: 'Node.js' },对象跟基本类型最大的不同就在于他 ...

  4. JavaScript中call、apply个人理解

    JavaScript中call.apply个人理解 一句话即通俗的说:call.apply 是为了改变this的状态而存在的 var lisi = {name:'李四',age:23};var zs ...

  5. 12.在JavaScript中的事件模型如何理解?

    一.事件与事件流 javascript中的事件,可以理解就是在HTML文档或者浏览器中发生的一种交互操作,使得网页具备互动性, 常见的有加载事件.鼠标事件.自定义事件等 由于DOM是一个树结构,如果在 ...

  6. python中浅拷贝和深拷贝的区别_Python中浅拷贝和深拷贝的区别

    Python中浅拷贝和深拷贝的区别 浅拷贝和深拷贝示意图 如上图,简单点说 1. copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象. 2. copy.deepcopy 深拷贝 拷贝 ...

  7. 彻底理解Python中浅拷贝和深拷贝的区别

    目录 前言 1. 浅拷贝和深拷贝的概念 2. is和==的区别 3. 赋值操作 4. copy模块里面的copy()方法 5. copy模块里面的deepcopy()方法 6.字典自带的copy方法 ...

  8. js的栈堆与浅拷贝、深拷贝的理解

    一:什么是堆栈?   我们都知道:在计算机领域中,堆栈是两种数据结构,它们只能在一端(称为栈顶(top))对数据项进行插入和删除. 堆:队列优先,先进先出:由操作系统自动分配释放 ,存放函数的参数值, ...

  9. JavaScript 的浅拷贝与深拷贝,栈与堆,深拷贝的多种方法,最全讲解

    栈与堆 在 JavaScript 中也会将基本类型与对象类型称为值类型与引用类型.这个是因为基本类型中存储的是数据完整的值,而在引用类型中存储的仅是指向数据的一个地址. 在大部分编程语言中,变量会被存 ...

最新文章

  1. OpenCV学习系列教程第五篇:测试和提高代码的效率
  2. web性能优化——关键渲染路径(上)
  3. 从门禁系统的使用体验看良好的交互设计原则
  4. [LeetCode]Merge Intervals
  5. 石家庄市职称计算机,河北石家庄2010年职称计算机考试报名通知
  6. easyui 动态设置单元格控件_比Excel还简单,实现动态报表原来只需要十分钟!
  7. 有很帅气的微信头像推荐吗?
  8. JVM 堆、栈概述 与 常见 OOM 原因及解决方案
  9. scara机器人动荷载_【机器人在线】SCARA机械结构参数计算说明 下
  10. 银河麒麟桌面操作系统V10node.js 14安装小助手
  11. ps入门第4天_ps画笔工具知识汇总_自定义画笔工具_画笔画彩带
  12. 从零学习Belief Propagation算法(二)
  13. 九型人格Enneagram
  14. h5php大转盘抽奖,html5的非常简单圆形转盘抽奖代码
  15. 图灵完备 java_图灵完备是什么?
  16. wps批量将文档括号内的字符串修改颜色
  17. 第八天 02.hydra暴力破解ssh密码以及ftp密码
  18. 太棒了!CSS颜色基本样式
  19. 【MATLAB-app】摸索2天,果断放弃gui,彻底爱上了appdesigner。
  20. [C和指针] ch12. 使用结构和指针

热门文章

  1. LeetCode 649. Dota2 参议院(循环队列)
  2. LeetCode 635. 设计日志存储系统(map)
  3. LeetCode 885. 螺旋矩阵 III
  4. 程序员面试金典 - 面试题 04.06. 后继者(循环中序遍历)
  5. LeetCode 1353. 最多可以参加的会议数目(排序+贪心,优先队列,难)
  6. linux发指令给网络设备,Linux学习笔记五(网络命令)
  7. oracle 打开 ctl,Oracle 19c 随系统systemctl启动数据库
  8. hbase的2.2.4版本支持哪个版本的hadoop_Hadoop 2.7 不停服升级到 3.2 在滴滴的实践
  9. redis 计数 java_redission计数器实现,redisTemplate计数器
  10. java郝斌_郝斌Java自学教程全集打包