JavaScript数组及非数组对象的深浅克隆详解原理
作者:daixiangcn 发布时间:2024-04-19 09:52:51
标签:JavaScript,数组,深浅克隆
什么是浅克隆、深克隆
浅克隆:直接将存储在栈中的值赋值给对应变量,如果是基本数据类型,则直接赋值对应的值,如果是引用类型,则赋值的是地址。
深克隆:将数据赋值给对应的变量,从而产生一个与源数据不相干的新数据(数据地址已变化)。即对象各个层级的属性。
JavaScript中基本数据类型使用符号“=”可以进行克隆,引用数据类型使用符号“=”只是改变了变量的指向,并没有进行真正的克隆操作。
1.对数组进行克隆
1.1 浅克隆
使用for循环进行浅克隆。
var arr1 = ['demo', 1, 2];
var arr2 = [];
// 数组的浅克隆
for (var i = 0; i < arr1.length; i++) {
arr2[i] = arr1[i];
}
console.log(arr2);
console.log(arr1 == arr2);
输出结果:
Array(3)0: "demo"1: 12: 2length: 3[[Prototype]]: Array(0)
false
1.2 深克隆
使用递归进行深克隆。
function deepClone(o) {
var result = [];
for (var i = 0; i < o.length; i++) {
result.push(deepClone(o[i]));
}
return result;
}
2.对非数组对象进行克隆
2.1 浅克隆
使用for循环进行浅克隆。
var obj1 = { a: 1, b: 2, c: 3, d: [4, 5, { e: 'demo' }] };
var obj2 = {};
// 对象的浅克隆
for (var i in obj1) {
obj2[i] = obj1[i];
}
console.log(obj2);
console.log(obj1 == obj2);
输出结果:
{a: 1, b: 2, c: 3, d: Array(3)}
false
2.2 深克隆
使用递归进行深克隆。
function deepClone(o) {
var result = {};
for (var i in o) {
result[i] = deepClone(o[i]);
}
return result;
}
3.整合深克隆函数
var obj1 = { a: 1, b: 2, c: 3, d: [4, 5, { e: 'demo' }] };
var arr1 = ['demo', 1, 2];
// 深克隆
function deepClone(o) {
if (Array.isArray(o)) {
// 是数组
var result = [];
for (var i = 0; i < o.length; i++) {
result.push(deepClone(o[i]));
}
} else if (typeof o == 'object') {
// 非数组,是对象
var result = {};
for (var i in o) {
result[i] = deepClone(o[i]);
}
} else {
// 基本类型值
var result = o;
}
return result;
}
console.log(deepClone(arr1));
console.log(deepClone(obj1));
来源:https://blog.csdn.net/yuanxiang01/article/details/120759457


猜你喜欢
- riginal_Data因为程序是为了实现对纯数值型Excel文档进行导入并生成矩阵,因此有必要对第五列文本值进行删除处理。Import_D
- Python版本:3.5网上找了好多资料都没有直观的写出怎么批量执行,so,整理了一个小程序。最初是为了用Python进行单元测试,同目录下
- 方法1:自定义异常# -*- coding:utf-8 -*-"""功能:python跳出循环"&q
- 在windows下安装配置Ulipad今天推荐一款轻便的文本编辑器Ulipad,用来写一些小的Python脚本非常方便。Ulipad下载地址
- OL定义有序列表的时候,除非指定list-style-position:inside;,否则文字和前导符是有缩进的。但有的时候,OL定义的列
- 联合索引又叫复合索引。对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分。例如索引是k
- 学习javaweb的时候,做了将页面上的的表单信息添加到数据库中的练习。提交表单的时候,需要保证每个输入框、单选按钮、复选框等都不为空,刚开
- Python之POST调用Restful接口示例# -*- coding: utf-8 -*-import jsonimport reimp
- defineComponent函数,只是对setup函数进行封装,返回options的对象;export function defineCo
- 本文实例为大家分享了python实现名片管理系统源代码,供大家参考,具体内容如下import osdef print_menu(): pri
- 一 环境阿里云服务器: CentOS 7.4 64位(基于RedHat)本机: macOS High Sierra二 压缩包JDK 
- 滤波算子简介ndimage中提供了卷积算法,并且建立在卷积之上,提供了三种边缘检测的滤波方案:prewitt, sobel以及laplace
- 需求背景女朋友的论文需要爬取YouTube视频热评,但爬下来的都是外文。主要设计 读取一个表格文件,获取需要翻译的文本
- 最近在代码评审的过程,发现挺多错误使用eval导致代码注入的问题,比较典型的就是把eval当解析dict使用,有的就是简单的使用eval,有
- 具体代码如下所示:import osfrom PIL import ImageUNIT_SIZE = 220 # the size of i
- 使用opencv-python,把一段视频中指定帧频间隔的图像保存到新建的文件中首先安装好python ,配置好opencv-python#
- 微信小程序 报错:this.setData is not a function在page中定义的代码如下,代码会报错:this.setDat
- 本文实例为大家分享了Vue实现计时器的具体代码,供大家参考,具体内容如下功能简介:1、初始值为0,点击【加】按钮,数字自+1;连续点击【加】
- Python的matplotlib包可以轻松的将数据可视化,博主最近遇到了一个问题,博主想同时在两个窗口展示两张图,但是代码运行结果总是显示
- 常见的双倍边距类问题都遇到过,但很少遇到这种有意思的,所以记录一下。这个BUG是发生在Standards模式下(就是包含XHTML或者HTM