JavaScript的深拷贝
2024-08-30 10:12:34
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
最新文章
- 在SpringMVC中获取request对象
- Selenium关键字驱动测试框架Demo(Java版)
- 配置jenkins,并把iOS包自动上传至fir.im
- 比较setImmediate(func),setTimeout(func),process.nextTick(func)
- lintcode 中等题:N Queens II N皇后问题 II
- SQL Server 2008如何进行数据库同步?
- QQ聊天界面的布局和设计(IOS篇)-第一季
- Objective-c中的单例
- Zend Server的WebAPI焦点:异步操作
- Java与C#的比较学习
- 【问题】sql数据库报无效的数据证书,需重新安装
- Javascript高级编程学习笔记(40)—— DOM(6)CDATASection、DocumentType
- 基于线程开发一个FTP服务器
- 19 个常用的 JavaScript 简写方法
- 斜率DP个人理解
- Kafka:ZK+Kafka+Spark Streaming集群环境搭建(四)针对hadoop2.9.0启动执行start-all.sh出现异常:failed to launch: nice -n 0 /bin/spark-class org.apache.spark.deploy.worker.Worker
- 全相FFT
- windows下快速启动或关闭系统服务方法
- 功能------常用快捷键(在win10下)
- Spark应用程序运行的日志存在哪里(转)