javascript实现深浅拷贝
深浅拷贝通常是对于引用数据类型进行的(数据类型为:对象(Object)、数组(Array)、函数(Function))
浅拷贝:
let obj = {id: 1, name: 2};
let newObj = obj; setTimeout(() => {
newObj.id = 2;
console.log(obj,newObj)
},1000); // 输出如下
// { id: 2, name: 2 } { id: 2, name: 2 }我们发现,随着newObj的变化,obj也随之变化,这明显不是我们想要的,数组也同样如此,那么就需要进行深拷贝了。
深拷贝:
方法1(封装函数)
// 构造一个深拷贝函数
function deepClone(obj) {
var result = Array.isArray(obj) ? [] : {}; // 判断当前传进来的是对象还是数组
for(var key in obj) {
if (obj.hasOwnProperty(key)) { // 该key是否存在
if (typeof obj[key] === 'object' && obj[key] !== null) { // obj[key]如果为object,递归调用该方法,obj[key] = arr || obj[key] = {}都为'object'
result[key] = deepClone(obj[key]);
} else {
result[key] = obj[key];
}
}
}
return result;
}let arr1 = [1,2,3,4,5];
let arr2 = deepClone(arr1);
arr2[0] = 'hello';
arr2[4] = 'world';
console.log(arr1); // [ 1, 2, 3, 4, 5 ]
console.log(arr2); // [ 'hello', 2, 3, 4, 'world' ] let obj1 = {id: 1, name: 1, love: [1,2,3,4], test: {id: 1, name: 1}};
let obj2 = deepClone(obj1);
obj2.love[0] = 'ecmascript';
obj2.test.id = 2;
console.log(obj1);
// { id: 1, name: 1, love: [ 1, 2, 3, 4 ], test: { id: 1, name: 1 } }
console.log(obj2);
// { id: 1,name: 1,love: [ 'ecmascript', 2, 3, 4 ],test: { id: 2, name: 1 } }方法2(JSON.parse和JSON.stringify)
let obj1 = {
id: 1,
name: 1
};
let obj2 = JSON.parse(JSON.stringify(obj1));
obj2.id = 2;
obj2.name = 2;
console.log(obj1,obj2);
// { id: 1, name: 1 }
// { id: 2, name: 2 }方法3(在nodeJS项目中,有一个lodash模块,我们可以利用它提供的方法来实现深度克隆,或者将其下载到本地,引入它对应的js文件也可如下)
lodash中文网 https://www.lodashjs.com/docs/latest
// npm install lodash -S const cloneDeep = require('lodash/cloneDeep')
let arr3 = [1,2,3,4];
let arr4 = cloneDeep(arr3);
arr4[1] = 'hello';
console.log(arr3,arr4); // [ 1, 2, 3, 4 ]
// [ 1, 'hello', 3, 4 ]
javascript实现深浅拷贝的更多相关文章
- JavaScript之深浅拷贝
数组的浅拷贝 如果是数组,我们可以利用数组的一些方法比如:slice.concat 返回一个新数组的特性来实现拷贝.比如: , true, null, undefined]; var new_arr ...
- javascript简单实现深浅拷贝
深浅拷贝知识在我们的日常开发中还算是用的比较多,但是之前的状态一直都是只曾听闻,未曾使用(其实用了只是自己没有意识到),所以今天来跟大家聊一聊js的深浅拷贝: 首先我们来了解一下javascript的 ...
- JavaScript深浅拷贝区别
分享一篇自己关注的微信订阅号(前端大全)文章:JavaScript浅拷贝与深拷贝 作者:浪里行舟 https://github.com/ljianshu/Blog/issues/5 这里很详细的讲解了 ...
- JavaScript数据存储和深浅拷贝实际运用
JavaScript分两种数据类型.1.简单数据类型有:number, string, boolean, undefined和null当声明一个简单数据类型的变量时,在内存中会把数据存在栈里.2.复杂 ...
- JavaScript中的事件委托机制跟深浅拷贝
今天聊下JavaScript中的事件委托跟深浅拷贝 事件委托 首先呢,介绍一下事件绑定 //方法一:通过onclick <button onclick="clickEvent()&qu ...
- JavaScript深浅拷贝
深浅拷贝 基本类型和引用类型 ECMAScript 中的变量类型分为两类: 基本类型:undefined,null,布尔值(Boolean),字符串(String),数值(Number) 引用类型: ...
- Javascript 中的深浅拷贝
工作中经常会遇到需要复制 JS 数据的时候,遇到 bug 时实在令人头疼:面试中也经常会被问到如何实现一个数据的深浅拷贝,但是你对其中的原理清晰吗?一起来看一下吧! 为什么会有深浅拷贝 想要更加透彻的 ...
- JavaScript中的深浅拷贝
深浅拷贝 在JS中,数据类型分为两类: 简单数据类型:Number.Boolean.String.undefined 引用数据类型:Array.Object.Function 简单数据类型通常 ...
- Python开发【第二章】:Python深浅拷贝剖析
Python深浅拷贝剖析 Python中,对象的赋值,拷贝(深/浅拷贝)之间是有差异的,如果使用的时候不注意,就可能产生意外的结果. 下面本文就通过简单的例子介绍一下这些概念之间的差别. 一.对象赋值 ...
随机推荐
- PAT Advanced 1035 Password (20 分)
To prepare for PAT, the judge sometimes has to generate random passwords for the users. The problem ...
- PAT Basic 1046 划拳 (15 分)
划拳是古老中国酒文化的一个有趣的组成部分.酒桌上两人划拳的方法为:每人口中喊出一个数字,同时用手比划出一个数字.如果谁比划出的数字正好等于两人喊出的数字之和,谁就赢了,输家罚一杯酒.两人同赢或两人同输 ...
- 02java基础——类和方法
1.类的定义 /* 定义类: 使用类的形式,对现实中的事物进行描述 事物: 属性,方法 属性: 变量 方法: 这个事物具备的功能 格式: public class 类名{ 属性定义 修饰符 数据类型 ...
- Dinic二分图匹配 || Luogu P3386
题面:[模板]二分图匹配 思路:Dinic实现二分图匹配,要建一个超级源点(S)和超级汇点(T),分别定为N+M+1和N+M+2 然后S去和N中的数建正边和反边,正边权值为1,反边权值为0:M中的数去 ...
- MySQL 5.7
博客地址:https://www.cnblogs.com/runningStudy/p/6444047.html mysql官网下载地址:https://downloads.mysql.com/arc ...
- 大数据学习笔记之初识Hadoop
1.Hadoop概述 1.1 Hadoop名字的由来 Hadoop项目作者的孩子给一个棕黄色的大象样子的填充玩具的命名 Hadoop的官网:http://hadoop.apache.org . 1.2 ...
- vue全家桶是啥?
Vue有著名的全家桶系列,包含了 1,调试插件:可以选择 Chrome 插件 vue Devtool(需要下载工具包).打开控制台选择 vue 面板.也可以选择 Vuex 选项.vuex(http:/ ...
- react native之封装离线缓存框架
请求数据=>本地有无缓存+缓存数据是否过期 =>可用 =>不可用 将代码封装成一个DataStore.js文件, 这里面主要提供:从本地获取数据,从网络获取数据,创建本地时间戳,请求 ...
- Navicat 出现的[Err] 1146 - Table 'performance_schema.session_status' doesn't exist已解决
[Err] 1146 - Table 'performance_schema.session_status' doesn't exist已解决 刚刚接触MySQL,就往数据库添加数据,就遇到这个问 ...
- VS2015编译问题:模块对于 SAFESEH 映像是不安全的
严重性 代码 说明 项目 文件 行 禁止显示状态 错误 LNK2026 模块对于 SAFESEH 映像是不安全的. zlibvc C:\MyDirectory\test2\zlib-\contrib\ ...