javaScript的拷贝有浅拷贝和深拷贝。拷贝我们一般拷贝对象,获取对象的内容(字段、函数)都给复制一遍

浅拷贝:一般只是简单的赋值

//浅拷贝
var obj1={name:"cat"};
var obj2=obj1;//直接赋值给obj2
obj2.name="pig";//修改
console.log(obj1.name); // pig
console.log(obj2.name); // pig
//obj2与obj1所应用的是同一个对象,只是简单复制对象内容
console.log(obj1 === obj2);//true

由上可知这种直接赋值式的浅复制是复制了同一个内存地址,所以有一个修改了其他也会被修改,因为它们同在一个地址里面。

深拷贝:复制对象的内容创建一个新的对象内容

//深拷贝1、利用 JSON 对象中的 parse 和 stringify
var obj3 = {
name: "cat",
show:function(){
console.log(this.name);
}
};
var obj4 = JSON.parse(JSON.stringify(obj3));
obj4.name = "pig";
console.log(obj3.name); // cat
console.log(obj4.name); // pig
obj3.show();//cat
//obj4.show(); //函数被丢失,出错

但是我们函数对象没有复制过来,它出错了。为了解决这种问题,我们又有了另外一种深复制——利用递归

递归方法:

//递归方法,进行深拷贝
function deepClone(obj) {
//传进来的参数如果是数组选择[],如果不是数组选择{}
let objClone = Array.isArray(obj) ? [] : {};
//判断传进来的是不是object类型,如果是基本类型就直接返回。
if(obj && typeof obj === "object") {
for(key in obj) {//枚举遍历
if(obj.hasOwnProperty(key)) {//判断obj是否有该名称的属性或对象
//判断ojb子元素是否为对象,如果是,递归复制
if(obj[key] && typeof obj[key] === "object") {
objClone[key] = deepClone(obj[key]);
} else {//当递归到子元素不是对象时、简单复制
//如果不是,简单复制
objClone[key] = obj[key];
 }
  }
  }
}
return objClone;
}

我们直接调用这个 递归函数就可以进行深拷贝了

var obj5 = {
name: "cat",
show: function() {
console.log("名称:"+this.name);
}
};
var obj6 = deepClone(obj5); //调用方法进行复制 obj6.name = "pig"; console.log(obj5.name); // cat
console.log(obj6.name); // pig obj5.show(); // cat
obj6.show(); // pig

JavaScript的深拷贝的更多相关文章

  1. javascript对象深拷贝,浅拷贝 ,支持数组

    javascript对象深拷贝,浅拷贝 ,支持数组 经常看到讨论c#深拷贝,浅拷贝的博客,最近js写的比较多, 所以也来玩玩js的对象拷贝. 下面是维基百科对深浅拷贝的解释: 浅拷贝 One meth ...

  2. javascript浅拷贝深拷贝理解记录

    javascript的深拷贝和浅拷贝问题几乎是面试必问的问题.好记性不如烂笔头,特此来记录一下自己对深拷贝浅拷贝的理解. 顾名思义,拷贝就是copy复制,在js中可以浅而理解为对一个对象或者数组的复制 ...

  3. JavaScript实现深拷贝(深复制) 面试题

    1.两种方法实现深拷贝(深复制) (1)方法一:兼容性好,请仔细看代码(网上大部分代码有Bug) (2)方法二:需要对象满足JSON数据格式.JOSN数据格式:http://www.cnblogs.c ...

  4. JavaScript中深拷贝实现

    JavaScript 中深拷贝实现   拷贝时候涉及到: 1.循环结构 2.判断数组 Array 还是对象 Object   函数实现 /** * 获取满足条件的数组中的第一个元素 * @param ...

  5. 也来玩玩 javascript对象深拷贝,浅拷贝

    经常看到讨论c#深拷贝,浅拷贝的博客,最近js写的比较多, 所以也来玩玩js的对象拷贝. 下面是维基百科对深浅拷贝的解释: 浅拷贝 One method of copying an object is ...

  6. JavaScript的深拷贝的实现

    JavaScript的数据类型 简单数据类型 string number boolean function null undefined 复杂数据类型 String Number Boolean Fu ...

  7. 【javascript】浅谈javaScript的深拷贝

        前言: 最开始意识到深拷贝的重要性是在我使用redux的时候(react + redux), redux的机制要求在reducer中必须返回一个新的对象,而不能对原来的对象做改动,事实上,当时 ...

  8. JavaScript之深拷贝和浅拷贝

    前言 工作中会经常遇到操作数组.对象的情况,你肯定会将原数组.对象进行‘备份’当真正对其操作时发现备份的也发生改变,此时你一脸懵逼,到时是为啥,不是已经备份了么,怎么备份的数组.对象也会发生变化.如果 ...

  9. javascript浅拷贝深拷贝详解

    一.浅拷贝 浅拷贝在现实中最常见的表现在赋值上面,例如 <!DOCTYPE html> <html lang="en"> <head> < ...

  10. 【javascript】详解javaScript的深拷贝

        前言: 最开始意识到深拷贝的重要性是在我使用redux的时候(react + redux), redux的机制要求在reducer中必须返回一个新的对象,而不能对原来的对象做改动,事实上,当时 ...

随机推荐

  1. 美化WebApi,使其统一返回Json格式

    博客部分代码来自其他博主,暂时找不到你的博文连接,如果您觉得我的代码中引入了您的代码或者文章,可在下方把您的博客文章写在下面,谢谢!!! WebApi有两种返回数据格式,一种是XML,一种是Json, ...

  2. two pointers 思想

    针对有序的序列特性做出的优化思想

  3. JVM系列二:垃圾回收

    什么时候回收对象 引用计数法 1.原理:为对象添加一个引用计数器,当对象增加一个引用时计数器加 1,引用失效时计数器减 1.引用计数为 0 的对象可被回收. 2.缺点:无法解决循环引用问题 可达性分析 ...

  4. JVM系列一:虚拟机内存区域

    虚拟机栈 1.虚拟机栈维护一个线程中所有方法的栈帧,每个栈帧中保存着这个方法中用到的局部变量表,操作数栈,常量引用 2.可以用-Xss来设置每个线程中虚拟机栈的大小,在jdk1.4之前默认虚拟机栈大小 ...

  5. ARRAY_MAP函数用法

    ARRAY_MAP函数用法 Posted on 2012-9-18, 22:15, by tmser, under php 总结 . 看php JSON 类中有这样一种用法array_map(arra ...

  6. Sql Server (MSSQLSERVER) 服务无法启动

    北京的冬天特别干燥,大清早的一同事就和服务器擦出了爱的火花,结果没想到竟导致服务器无法开机了,这可尴尬了,代码可都在服务器上托管着呢,一会还等着上线呢,必须得修啊.他们说是主板坏了,就另外找了一台电脑 ...

  7. [NgRx] Setting up NgRx Router Store and the Time-Travelling Debugger

    Make sure you have the@ngrx packages installed: "@ngrx/data": "^8.0.1", "@n ...

  8. &和&&,|和||的用法区别

    &和&&的区别是,&会执行两边,不管第一个是否成立&&只会执行一边,如果第一个条件为假,则不会走第二个条件举例public class Test2{ p ...

  9. 树状数组例题-数星星,简单题easy,校门外的树2,清点人数

    [例1]数星星 天空中有一些星星,这些星星都在不同的位置,每个星星都有个坐标,如果一个星星的左下方(包括正左和正下)有k颗星星,就说这颗星星是k级的. 比如,上图中,星星5是3级的(1,2,4在其左下 ...

  10. web+页面支持批量下载吗

    一.此方法火狐有些版本是不支持的 window.location.href = 'https://*****.oss-cn-**.aliyuncs.com/*********';二.为了解决火狐有些版 ...