浅拷贝和深拷贝

ゞ 浴缸里的玫瑰 2022-01-19 00:41 493阅读 0赞

浅拷贝:浅克隆之所以被称为浅克隆,是因为对象只会被克隆最外部的一层,至于更深层的对象,则依然是通过引用指向同一块堆内存.

1.第一种方法:

  1. function shadowClone(o) {
  2. const obj = {};
  3. for (let i in o) {
  4. obj[i] = o[i];
  5. }
  6. return obj;
  7. }
  8. var oldObj = {
  9. a: 1,
  10. b: 3,
  11. c: [1, 3, 5, 7, 9]
  12. };
  13. var newObj = shadowClone(oldObj);复制代码

第二种:

  1. var oldObj = {
  2. a: 1,
  3. b: 3,
  4. c: [1, 3, 5, 7, 9]
  5. };
  6. var newObj1 = Object.assign({}, oldObj);复制代码

深拷贝

深拷贝: 创建一个新的对象和数组,将原对象的各项属性的“值”(数组的所有元素)拷贝过来,是“值”而不是“引用”

  1. // 深拷贝 // 获取类型
  2. function getType(obj) {
  3. var toString = Object.prototype.toString;
  4. var map = {
  5. '[object Boolean]': 'boolean',
  6. '[object Number]': 'number',
  7. '[object String]': 'string',
  8. '[object Null]': 'null',
  9. '[object Undefined]': 'undefined',
  10. '[object Array]': 'array',
  11. '[object Function]': 'function',
  12. '[object RegExp]': 'regExp',
  13. '[object Date]': 'date',
  14. '[object Object]': 'object'
  15. }
  16. if (obj instanceof Element) {
  17. // 因为对不同标签,toString会返回对应不同标签的构造函数
  18. return 'element';
  19. }
  20. return map[toString.call(obj)];
  21. }
  22. function deepClone(data) {
  23. var type = getType(data)
  24. var obj;
  25. if (type === 'array') {
  26. obj = []
  27. for (var i = 0; i < data.length; i++) {
  28. obj.push(deepClone(data[i]))
  29. }
  30. } else if (type === 'object') {
  31. obj = {}
  32. for (var key in data) {
  33. obj[key] = deepClone(data[key]);
  34. }
  35. } else {
  36. obj = data;
  37. }
  38. return obj;
  39. }
  40. var oldObj = {
  41. a: 1,
  42. b: 2
  43. }
  44. const newObj = deepClone(oldObj);
  45. const newObj1 = newObj.c = 4;
  46. console.log(oldObj, newObj)
  47. let oldData = [1, 2, 3, 4, 4];
  48. const newData = deepClone(oldData);
  49. const newData1 = newData.push({ a: 4, b: 7 });
  50. console.log(newData, '--->newData', oldData, '---->oldData');复制代码

转载于:https://juejin.im/post/5ce49505e51d4510bf1d65e1

发表评论

表情:
评论列表 (有 0 条评论,493人围观)

还没有评论,来说两句吧...

相关阅读

    相关 拷贝拷贝

    浅拷贝(shallowCopy)只是增加了一个指针指向已存在的内存地址, 深拷贝(deepCopy)是增加了一个指针并且申请了一个新的内存,使这个增加的指针指向这个新的内存,

    相关 拷贝拷贝

    深拷贝和浅拷贝的理解? 深拷贝和浅拷贝是针对复杂数据类型来说的,浅拷贝只拷贝一层,而深拷贝是层层拷贝。 浅拷贝:将原数组和原对象的引用直接拷贝到新数组和新对象,新对象只

    相关 拷贝拷贝

    一、浅拷贝 1、浅拷贝和赋值的区别     赋值:当我们把一个对象赋值给一个新变量时,赋的其实是这个对象在栈中的地址,而不是堆中的数据,也就是两个对象指向的是同一个

    相关 拷贝拷贝

    最近更新时间:2017年11月28日22:44:54 [《我的博客地图》][Link 1]     对于程序员来说,编程语言就像是创作的工具,掌握扎实的语言功底才能创作出优

    相关 拷贝拷贝

    深拷贝和浅拷贝 浅拷贝:对变量进行比较浅层次的拷贝,比如变量的赋值,其实2个变量都指向同一个内存地址。内存地址共享。 深拷贝:对变量进行深层次的拷贝,拷贝了一份数据,2

    相关 拷贝拷贝

    深拷贝和浅拷贝 浅拷贝,只是拷贝基本类型的数据,而引用类型数据,是复制的引用而不是复制的对象。 深拷贝,将原对象所有的数据复制一份到另一个新开辟的空间。 Java

    相关 拷贝拷贝

    浅拷贝 浅拷贝会创建新对象,其内容非原对象本身的引用,而是原对象内第一层对象的引用。 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5n