[记录] JavaScript 中的深浅拷贝(克隆)

浅拷贝和深拷贝针对的是Object、Array这样复杂的引用类型数据
简单说:浅拷贝只复制一层的属性,而深拷贝则递归复制所有层级的属性

一、浅拷贝

1 function clone(origin, target) {
2     var result = target || {};
3     for ( var prop in origin ){
4         target[prop] = origin[prop];
5     }
6     return result;
7 }

如果对象的属性值是数组或对象,实际上,存储的值是一个内存地址;
原始数据和拷贝的数据指向的是同一个地址,可能别篡改。

二、深拷贝
思路:
遍历对象 for (var prop in obj)
1. 判断是不是原始值 typeof() object
2. 判断是数组还是对象 instanceof constructor toString(在iframe父子作用域中依旧正确)
3. 建立相应的数组或对象 然后递归

 1 function deepClone(origin, target) {
 2     var target = target || {},
 3         toStr = Object.prototype.toString,
 4         arrStr = "[object Array]";
 5     for(var prop in origin) {
 6         // 判断对象是否包含特定的自身属性
 7         if(origin.hasOwnProperty(prop)) {
 8             // 排除null这个特殊的object并且是对象类型的引用类型数据
 9             if(origin[prop] !== null && typeof(origin[prop]) == ‘object‘){
10                 target[prop] = (toStr.call(origin[prop]) == arrStr) ? [] : {};
11                 deepClone(origin[prop], target[prop]);
12             }else{
13                 // 拷贝基本类型数据
14                 target[prop] = origin[prop];
15             }
16         }
17     }
18     return target;
19 }

深拷贝不仅将原对象的基本类型数据拷贝,而且将原对象上的引用类型数据采用递归的方式拷贝到新的对象上。这样就不会出现引用类型数据指向同一对象的问题。

jQuery提供了 $.extend() 深浅拷贝方法
浅拷贝:$.extend({}, obj1, obj2);
深拷贝:$.extend(true, obj1, obj2);

原文地址:https://www.cnblogs.com/yuxi2018/p/9445393.html

时间: 2024-10-27 18:09:50

[记录] JavaScript 中的深浅拷贝(克隆)的相关文章

Python中的深浅拷贝详解

要说明Python中的深浅拷贝,可能要涉及到下面的一系列概念需要简单说明下: 变量-引用-对象(可变对象,不可变对象)切片-拷贝-浅拷贝-深拷贝 [变量-对象-引用] 在Python中一切都是对象,比如说: 3, 3.14, 'Hello', [1,2,3,4],{'a':1}...... 甚至连type其本身都是对象,type对象 Python中变量与C/C++/Java中不同,它是指对象的引用 单独赋值: 比如说: >>> a = 3 在运行a=3后,变量a变成了对象3的一个引用.在

C++中的深浅拷贝问题

问题描述:C++中的深浅拷贝可谓炙手可热的经典题型之一,是许多公司面试中喜欢提及的问题,对于一般的对象例如:int a=10: int b=20:直接赋值和复制没有什么问题,但是当对象上升为类对象时,其类的内部可能存在各种类型的成员变量,在拷贝过程中就存在了深浅拷贝这一问题. ★大笔一挥匆忙写出这种代码不足为奇,但却会引发许多未曾考虑的问题: #define _CRT_SECURE_NO_WARNINGS   #include<iostream>   #include<cstring&g

Python中的深浅拷贝

Python中的深浅拷贝 前言:我们在了解深浅拷贝之前首先需要明白的一点知识 不可变类型数据:不可变类型即指当改变其内元素时,内存空间将会发生变化,比如常见的不可变类型有:str,boolean, int,tuple. temp = "哈哈哈" ret = temp.replace("哈", "嘿", 2) print(temp) # 哈哈哈 print(ret) # 嘿嘿哈 # 我们可以看到temp的值并没有发生改变,这就是为什么对str数据改

随笔,记录JavaScript中的面试题

我不知道我的js水平怎么样,但是今天有点受打击,看到很多题有坑.看了一些面试题,我记录下今天遇到的坑吧. 问题1:作用域 考虑以下代码,输出结果是什么? (function() { var a = b = 5; })(); console.log(b); 答案是5. 这道题我知道,陷阱在于var a = b =5,如果是声明,应该是var a,b =5;这样a,b的值都为5,由于a,b的都在函数作用域里面,所以外部是输出不出来的,则会显示b = undefined.而这里,由于js的特性,所以这

javascript中对象的深度克隆

零.寒暄 又是一个月多月没有更新博客了,这段时间回学校处理下论文的事情,实习的生活也暂时告一段落(在公司上班,才发现学校里面的生活简直如天堂一般,相信很多已经毕业的小伙伴肯定被我说中了,说中了请给本文点个赞,哈哈!).希望接下来自己的更新进度能加快,马上又是一年校招时,被虐也好.大牛虐别人也罢,总之祝福各位今年要找工作的小伙伴们好运.那么,今天就聊一下一个常见的笔试.面试题,js中对象的深度克隆.翻了下这个题目,在很多地方出现过,已经算一个老的题目了,但是每年的校招中总会考到,其实想想,这个题目

浅谈关于java中的深浅拷贝

一.浅拷贝(shallow copy) 1.如何实现浅拷贝? Object类 是所有类的直接或间接父类,Object中存在clone方法,如下 protected native Object clone() throws CloneNotSupportedException; 如果想要使一个类的对象能够调用clone方法 ,则需要实现Cloneable接口, 并重写 clone方法: public class Student implements Cloneable{ private int s

结构体中的深浅拷贝

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> #include <stdlib.h> typedef struct Peo { char *name; int age; }peo; int main(void) { peo p1; p1.name = (char *)malloc(sizeof(char) * 30); if (p1.name == NULL) return;

Python中的深浅拷贝,赋值及引用

简单来说,若对象a中存的是列表或字典等可变对象,b对a的浅拷贝只是对对象第一层的复制,修改b第二层的元素仍然会影响两个对象. 深拷贝则是不会影响原来的对象. import copy.copy() 浅拷贝 copy.deepcopy()  深拷贝 赋值操作更像是一个引用,新的赋值会创建一个新的内存地址,指向改变了,原来的内存地址还会存在. 参考文章地址: python基础(5):深入理解 python 中的赋值.引用.拷贝.作用域 http://my.oschina.net/leejun2005/

[记录] JavaScript 中的函数

函数: 函数是一段可以反复调用的代码块.可以传递参数,不同的参数会返回不同的值. 函数声明的三种方法: 1. function 命令 function 命令声明的代码块,就是一个函数. function 命令后面是函数名,函数名后面是一对圆括号(), 里面可以传入参数.函数体放在大括号里面. function show(name) { // 代码块... console.log( name ); } 2. 函数表达式 除了用 function 命令声明函数, 还可以采用变量赋值的写法. var