深浅拷贝的理解

一、理解

1、深拷贝:当拷贝完一个对象的时候,其中一个对象的数据发生了变化,另一个对象的数据也会发生变化。

  因为深拷贝拷贝的是索引

2、浅拷贝:当拷贝完一个对象的时候,其中一个对象的数据发生了变化,另外一个对象的数据 不会发生变化。

  因为浅拷贝拷贝的是数值

二、知识点补充:

1、合并对象:

 Object.assign()合并对象
 参数1:需要合并的对象A
 参数2:需要进行合并的对象B
 .....

 返回值是一个合并后的对象

2、堆 和 粘 的理解

栈:原则  先进后出
    栈里面基本上全部都是放的基本数据类型  和  索引 地址

堆:
    堆里面基本上全部都是放的引用数据类型   数据都存放在堆里面  而索引都存在栈里面

三、浅拷贝的使用

//拷贝的对象是多层的情况

例:
var obj = {
    person:{
        name:"QQQ",
        age:33,
        sex:"女"
    }
}    

方案一:
var newObj = Object.assign({},obj)
console.log(newObj);
newObj.person.name = "AAA";

console.log(obj,newObj)

方案二:
//合并对象 跟Object.assign用法一样
var newObj = $.extend({},obj);

console.log(newObj)
newObj.person.name = "AAA";
console.log(obj,newObj)

方案三:
//封装函数遍历
function copyObj(obj){
    var newObj = {};
    for(var key in obj){
        newObj[key] = obj[key]
    }
    return newObj;
}

var newObj = copyObj(obj);

newObj.person.name="AAA";
console.log(obj,newObj)

四、深拷贝的使用

分为:对象是单层和多层的情况

    //对象是单层的情况
var obj = {
    name:"WWW",
    age:33,
    sex:"不详"
}
方案一:
var newObj = Object.assign({},obj);
console.log(newObj);
newObj.name = "EEE";
console.log(obj,newObj)
----------------------------------------------
    //对象是多层的情况
var obj = {
    person: {
        name: "QQQ",
        age: 33,
        sex: "女"
    }
}

方案二、
//前面加true,则表示浅拷贝(注意区别深拷贝)
var newObj = $.extend(true,{},obj)

console.log(newObj);
newObj.person.name = "AAA";
console.log(obj,newObj)

方案三:
    //使用JSON.parse  JSON.stringify

var newObj = JSON.parse(JSON.stringify(obj));
console.log(newObj);
newObj.person.name="AAA";
console.log(obj,newObj)

原文地址:https://www.cnblogs.com/-roc/p/10019552.html

时间: 2024-10-14 00:54:45

深浅拷贝的理解的相关文章

python深浅拷贝的理解和区分

1 import copy 2 3 a1 = ['s1','s2','s3'] 4 5 #可变数据类型 6 a = [1,2,a1] 7 8 b = a 9 a1.append('s4') 10 #浅拷贝 11 c = copy.copy(a) 12 #深拷贝 13 d = copy.deepcopy(a) 14 15 #可变数据类型打印 16 print('值打印----:') 17 print(a1) 18 print(a) 19 print(b) 20 print(c) 21 print(

【C++】 深浅拷贝浅析

C++中深拷贝和浅拷贝的问题是很值得我们注意的知识点,如果编程中不注意,可能会出现疏忽,导致bug.本文就详细讲讲C++深浅拷贝的种种. 我们知道,对于一般对象:     int a = 1;     int b = 2; 这样的赋值,复制很简单,但对于类对象来说并不一般,因为其内部包含各种类型的成员变量,在拷贝过程中就会出现问题 例如: #include <iostream> using namespace std; class String { public:     String(cha

关于:1.指针与对象;2.深浅拷贝(复制);3.可变与不可变对象;4.copy与mutableCopy的一些理解

最近对深浅拷贝(复制)做了一些研究,在此将自己的理解写下来,希望对大家有所帮助.本人尚处在摸索阶段,希望各位予以指正. 本文包括如下方向的探索: 1.指针与对象: 2.深/浅拷贝(复制): 3.可变/不可变对象: 4.Objective-C中的copy与mutableCopy方法. 一.指针与对象 在初始学习编程的时候,对于绝大多数面向对象编程的语言,这都是个绕不开的重点与难点.非常惭愧的是对它的认识我一直是不够的,并且感觉这项技术有许多的内容可以挖掘.说这是面向对象编程的核心思想也不为过.很多

小数据池、集合和深浅拷贝的个人理解

小数据池----缓存机制(驻留机制) ==:判断两边内容是否相等 is :判断基于内存地址进行判断 小数据池的数字范围-5~256 代码块:一个文件.一个函数.一个模块,终端中每一行是一个代码块 代码块支持的数据类型:数字:在同一个代码块中.只要内容相同就采用相同的内存地址(-6往后都不是)在做乘法的时候范围-5~256.数字在做乘法的时候不能使用浮点数(这些都是在cham中的结果) 字符串:在同一代码块中,只要内容相同就采用相同的内存地址.乘法的时候总长度不能超过20.乘法的时候中文.特殊符号

深浅拷贝的使用场景分析

浅 复 制:在复制操作时,对于被复制的对象的每一层复制都是指针复制. 深 复 制:在复制操作时,对于被复制的对象至少有一层复制是对象复制. 完全复制:在复制操作时,对于被复制的对象的每一层复制都是对象复制. 注:1.在复制操作时,对于对象有n层是对象复制,我们可称作n级深复制,此处n应大于等于1. 2.对于完全复制如何实现(目前通用的办法是:迭代法和归档),这里后续是否添加视情况而定, 暂时不做讲解.  3.指针复制俗称指针拷贝,对象复制也俗称内容拷贝. 4.一般来讲, 浅层复制:复制引用对象的

深浅拷贝 python

原文:http://www.jb51.net/article/15714.htm 1. copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象.2. copy.deepcopy 深拷贝 拷贝对象及其子对象一个很好的例子: import copya = [1, 2, 3, 4, ['a', 'b']]  #原始对象b = a  #赋值,传对象的引用c = copy.copy(a)  #对象拷贝,浅拷贝d = copy.deepcopy(a)  #对象拷贝,深拷贝a.append(5)

python 深浅拷贝 进阶

主要理解新与旧到底在哪里 这样也就理解了 深浅拷贝 先说说赋值,其实python中的赋值其实是赋值了一个引用,例如: foo1=1.0 foo2=foo1 用操作符is判断时,你可以发现结果是true,是因为python是先创建了一个对象1.0,然后这个对象的引用又被赋值给了foo1和foo2,但是如果是这样: foo1=1.0 foo2=1.0 这时你会发现,这其实是创建了两个不同的对象,用内建函数id()可以发现,二者的身份不同: 其实python还有一个特例,例如: a=1 b=1 你会发

C++/C#中堆栈、对象内存模型、深浅拷贝、Array.Clone方法

转载自:http://blog.csdn.net/jarvischu/article/details/6425534 目录 1.      C++/C#中对象内存模型..................................................................................................... 1 1.1.       栈内存与堆内存.............................................

python之路-深浅拷贝

深浅拷贝用法来自copy模块. 导入模块:import copy 浅拷贝:copy.copy 深拷贝:deepcopy 字面理解:浅拷贝指仅仅拷贝数据集合的第一层数据,深拷贝指拷贝数据集合的所有层.所以对于只有一层的数据集合来说深浅拷贝的意义是一样的,比如字符串,数字,还有仅仅一层的字典.列表.元祖等 对于以下数据深浅拷贝的意义是一样的: name = 'beijing' age = 12 list1 = [1,2,3,4] dic1 = {'name':'beijing','age':20}