赋值、浅拷贝和深拷贝

三种方法的形式存在一定的类似,但是也存在各个之间不相同的地方。

浅拷贝和深拷贝是用在对象(Object)或者数组(Array)这样的数据类型拷贝赋值时候的说法,而赋值操作也可以用在基础的数据类型,如Number、String等;

赋值(对于对象类型数据的影响):赋于该值在栈中的地址,而不是堆中的数据,使得两个对象同时指向到同一个存储的空间,如果有某一个对象改变,其实都是改变存储空间的内容,从而对两个对象都产生相同的影响;

var aa = [ 1, 2, 3 ],bb;
bb = aa;
console.log(aa, bb); // aa = [1,2,3], bb = [1,2,3];
bb.push(5);//这里操作的是aa、bb指向的存储空间,所以aa、bb的值都发生了变化
console.log(aa, bb); // aa = [1,2,3,5], bb = [1,2,3,5];
bb[0] = 10;//这里操作的是aa、bb指向的存储空间,所以aa也发生了变化
console.log(aa, bb); // aa = [10,2,3,5], bb = [10,2,3,5];
bb = [ 2, 3, 4 ];//这里已经把bb指向了另一个数组,所以不会影响aa的值
console.log(aa, bb); // aa = [1,2,3,5], bb = [2,3,4];

浅拷贝(按位拷贝对象,如果是基本数据类型,就拷贝这个类型的值,如果是内存对象,则拷贝这个内存地址,所以浅拷贝介于赋值与深拷贝之间,浅拷贝过来的对象,可能存在改变某一个属性的值会影响另一个对象,也可能不影响)

ps:该浅拷贝的方法会覆盖原对象中相同属性的值,不需覆盖可以进行判断

//浅拷贝的方法
var extend = function(to, from) {
for (var property in from) {
        //if(to.hasOwnProperty(property)) continue; //不需要覆盖可以执行该方法
        if(!from.hasOwnProperty(property)) continue;
        Object.defineProperty(to,property,Object.getOwnPropertyDescriptor(from,property));
}
return to;
};

var aa = { name: 'ou', language: [ 'chinese' ] };
var bb = {};

bb = extend(bb, aa);
console.log('aa---', aa, 'bb---', bb);
bb.name = 'ming';
bb.language[0] = 'english';
console.log('aa---', aa, 'bb---', bb);

深拷贝,相对于浅拷贝,就是把对于引用内容地址的对象,新开辟一块新的内存地址用于存放拷贝过来的内容,从而使得两个对象不会再相互影响

ps:深拷贝涉及到比较复杂的数据类型的判断,

可遍历的:Object、Array 、Map、Set

不可遍历的:Bool、Number、String、Date、Error等

还有正则、克隆函数等

//简单对对象类型进行判断
var extend = function(to, from) {
for (var property in from) {
if (typeof from[property] === 'object') {
let cloneTarget = Array.isArray(from[property]) ? [] : {}; //进行判断,属性的值是对象还是数组
for (var key in from[property]) {
cloneTarget[key] = from[property][key];
}
to[property] = cloneTarget;
} else {
Object.defineProperty(to, property, Object.getOwnPropertyDescriptor(from, property));
}
}
return to;
};
...未完待续(后面可能补充有关对于类型的判断,还有一些其它大神看到的性能优化、循环引用的问题)
(0)

相关推荐

  • 前端【JS】,深拷贝与浅拷贝的区别及详解!

    我是前端小白一枚,为了巩固知识和增强记忆,开始整理相关的知识,方便以后复习和面试的时候看看. OK,让我们进入正题~ 先说说浅拷贝和深拷贝的理解吧,个人是这样理解的: 两个对象A.B, A有数据B为空 ...

  • 面试题-python 浅拷贝和深拷贝(copy模块)

    前言 面试的时候经常会问到深拷贝和浅拷贝,那么python的深拷贝和浅拷贝有什么区别呢? 思考题 先来看 2 个简单的案例, 对元素 a/aa 重新赋值一个新的变量 b/bb 后,改变原来 a/aa ...

  • 深拷贝学习笔记

    在开发过程中,我碰到了一个问题,让我找了好久问题在哪里,最后我发现是最开始赋值的时候没有深拷贝值,导致了原本值被覆盖污染,这里和大家分享下我的解决方法 var i = 5; var j = i; j= ...

  • JS的赋值与深浅拷贝实例

    赋值 基本类型: 传值,在栈内存中的数据发生数据变化的时候,系统会自动为新的变量分配一个新的之值在栈内存中,两个变量相互独立,互不影响的 引用类型: 传址,只改变指针的指向,指向同一个对象,两个变量相 ...

  • js 基本数据类型

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  • Interview:算法岗位面试—10.11下午—上海某公司算法岗位(偏机器学习,互联网数字行业)技术面试考点之XGBoost的特点、python的可变不可变的数据类型、赋值浅拷贝深拷贝区别

    ML岗位面试:10.11下午-上海某公司算法岗位(偏机器学习,互联网数字行业)技术面试考点之XGBoost的特点.python的可变不可变的数据类型.赋值浅拷贝深拷贝区别Interview:算法岗位面 ...

  • Java学习——33、浅拷贝和深拷贝

    Java不提供默认拷贝构造方法,如果要将一个对象的值赋给另一个对象需要自己写拷贝构造方法. 1.拷贝构造方法 注:使用=并不是调用构造方法,而只是将地址赋给对象而已. 如:Person s=new P ...

  • 【Python 成长之路】快速理解复制、浅拷贝、深拷贝

    [本文已由 鹏哥贼优秀 授权转载(原创)作者:鹏哥贼优秀] 1. 示例代码 在进行示例代码展示前,我们先理解下什么叫 复制.浅拷贝.深拷贝. [直接赋值]:其实就是对象的引用(别名). [浅拷贝 (c ...

  • 浅拷贝,深拷贝和写时拷贝(string类)

    浅拷贝浅拷贝:编译器只是直接将指针的值拷贝过来,结果多个对象共用了一块内存,当一个对象调用了析构函数将这块内存释放掉之后,另一些对象不知道这块空间已经还给了系统,再次调用析构函数进行释放时发现已经释放 ...

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

    摘要:Python,引用赋值,深拷贝,浅拷贝 总结一下Python中的变量的引用赋值,深拷贝和浅拷贝,先上结论 赋值引用会直接将内存地址传递过去,此时变量间不仅值相等,内存地址也相等,是同一个对象. ...

  • Python中深拷贝与浅拷贝的区别?

    公众号新增加了一个栏目,就是每天给大家解答一道Python常见的面试题,反正每天不贪多,一天一题,正好合适,只希望这个面试栏目,给那些正在准备面试的同学,提供一点点帮助! 小猿会从最基础的面试题开始, ...

  • JavaScript之浅谈深拷贝与浅拷贝

    这一章我们聊一下js中深拷贝与浅拷贝 深拷贝和浅拷贝的区别? 1.浅拷贝: 将原对象或原数组的引用直接赋给新对象,新数组,新对象/数组只是原对象的一个引用 2.深拷贝: 创建一个新的对象和数组,将原对 ...