最简js深浅拷贝说明

1.浅拷贝

  浅拷贝是拷贝引用,拷贝后的引用都是指向同一个对象的实例,彼此之间的操作会互相影响。

   浅拷贝分两种情况:

        1、直接拷贝源对象的引用

        2、 源对象拷贝实例,但其属性对象(类型为ObjectArray的属性)拷贝引用

  直接拷贝源对象的引用

//最简单的例子var a = {c:1};
var b = a;
console.log(a === b); // 输出true。
a.c = 2;
console.log(b.c); // 输出 2,,这里就是拷贝了对象的引用,从而两边都改变了

  源对象拷贝实例,其属性对象拷贝引用

  说明:外层源对象是拷贝实例,当其属性元素为复杂数据类型时,内层元素拷贝引用。这时对源对象直接操作,不影响两对象,但是对其属性操作时候,会改变两对象的属性的值。
  常用方法为:Array.prototype.slice()Array.prototype.concat()jQury$.extend({},obj)

var a = [{c:1}, {d:2},2];
var b = a.slice();
console.log(a === b); // 输出false,说明外层数组拷贝的是实例
a[0].c = 3;
console.log(b[0].c); // 输出 3,说明其元素拷贝的是引用a[2]=4;console.log(b[2]); //输出 2,不是复杂数据类型,所以没有变,没有引用

2.深拷贝

  将重新分配内存,并且把源对象所有属性都进行新建拷贝,以保证对象的引用图不包含任何原有对象或对象图上的任何对象,拷贝后的对象与原来的对象是完全隔离,互不影响。

 深拷贝

说明:深拷贝后,两个对象,包括其内部的元素互不干扰。常见方法有JSON.parse(),JSON.stringify()jQury$.extend(true,{},obj):

b = JSON.parse( JSON.stringify(a) )//最简单的深拷贝

  但有局限性:

  • 无法复制函数
  • 原型链没了,对象就是object,所属的类没了

jQury$.extend(true,{},obj):

var a = {c: {d: 1}};
var b = $.extend(true, {}, a);
console.log(a === b); // 输出false
a.c.d = 3;
console.log(b.c.d); // 输出 1,没有改变。

深拷贝本质理解:将原对象各个属性所包含的对象也依次采用深复制的方法“递归复制”到新对象上。这就不会存在上面 obj 和 shadowObj 的 arr 属性指向同一个对象的问题。例:

var deepCopy= function(source) {
var result={};
for (var key in source) {
      result[key] = typeof source[key]===’object’? deepCoyp(source[key]): source[key];
   }
   return result;
}//通过递归调用复制对对象上的每一个子类进行复制,从而达到时属性指向不同对象

复杂全面的代码,可以学习借鉴

function() {
   function _type(value) {
       return Object.prototype.toString.call(value).slice(8).slice(0, -1).toLowerCase();
   }

   function isArray(value) {
       return _type(value) == ‘array‘;
   }

   function isObject(value) {
       return _type(value) == ‘object‘;
   }

   function cloneArray(src, dest) {
       src.forEach(function(item, index) {
           if (isArray(item)) {

               console.log(‘yes‘)
               dest[index] = [];
               copy(src[index], dest[index]);
           } else {
               dest[index] = src[index];
           }
       });

   }

   function cloneObject(src, dest) {
       for (var key in src) {
           // filter 原型链上面的属性
           if (src.hasOwnProperty(key)) {
               if (isObject(src[key])) {
                   // 判断循环引用的问题
                   if (src[key] === src) {
                       dest[key] = src;
                   } else {
                       dest[key] = {};
                       copy(src[key], dest[key]);
                   }
               } else if (isArray(src[key])) {

                   dest[key] = [];
                   cloneArray(src[key], dest[key])

               } else {
                   dest[key] = src[key];

               }
           }
       }

   }

   function cloneDeep(src) {
       if (isArray(src)) {
           var dest = [];
           cloneArray(src, dest);
       }
       if (isObject(src)) {

           var dest = {};
           cloneObject(src, dest);

       }
       return dest;
   }

   window.clone = cloneDeep;

})();

如有错误欢迎留言改正……

时间: 2024-08-26 13:05:17

最简js深浅拷贝说明的相关文章

js 深浅拷贝

//浅拷贝:拷贝就是复制,就相当于把一个对象中的所有的内容,复制一份给另一个对象,直接复制,或者说,就是把一个对象的地址给了另一个对象,他们指向相同,两个对象之间有共同的属性或者方法,都可以使用 var obj1={ age:10, sex:"男", car:["奔驰","宝马","特斯拉","奥拓"] }; //另一个对象 var obj2={}; //写一个函数,作用:把一个对象的属性复制到另一个对象中

JS深浅拷贝

1.浅拷贝: 将原对象或原数组的引用直接赋给新对象,新数组,新对象/数组只是原对象的一个引用: 2.深拷贝: 创建一个新的对象和数组,将原对象的各项属性的“值”(数组的所有元素)拷贝过来,是“值”而不是“引用”: 使用深拷贝的场景: 在改变新的数组(对象)的时候,不改变原数组(对象): 深拷贝数组(只拷贝第一级数组元素) 1.for循环遍历数组: var array = [1, 2, 3, 4, 5];     function copy(array) {         var newArra

js的深浅拷贝

js数据类型包括5种简单数据类型(或者基本数据类型):Undefined, Null, Number, String, Boolean, 指的是保存在栈内存中的简单数据段.还有一种复杂数据类型(引用数据类型):Object Function Array,指的是那些保存在堆内存中的对象. 深浅拷贝只是针对Object,Array这样的复杂对象.javascript存储对象都是存地址. 对象: 浅拷贝只是针对对象的各个属性进行一次复制,复制前后两个属性指向的还是同一块内存地址 深拷贝不仅对各个属性进

js通过一个方法实现对象的深浅拷贝。

众所周知,对象的深浅拷贝是工作中肯定会遇到的问题.所以,今天考虑写个小的功能来记录一下 //type:boolean,true-deep,true为深拷贝, function extendCopy(type,item){ if(typeof type != "boolean" || typeof item !='object'){ return } var newObj = item.constructor ==="Array" ?[]:{}; if(type){

深浅拷贝的使用场景分析

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

Day2.字典,字符串,元组,字典,集合set,类的初步认识,深浅拷贝

Python之路[第二篇]:Python基础(一) 入门知识拾遗 一.作用域 对于变量的作用域,执行声明并在内存中存在,该变量就可以在下面的代码中使用. if 1==1: name = 'JasonWang' print name 下面的结论对吗? 外层变量,可以被内层变量使用 内层变量,无法被外层变量使用 二.三元运算 result = 值1 if 条件 else 值2 #三目运算符 name = 'aa' if 1 == 2 else 'SB'print(name)SB 如果条件为真:res

python学习笔记4:基础(集合,collection系列,深浅拷贝)

转载至:http://www.cnblogs.com/liu-yao/p/5146505.html 一.集合 1.集合(set): 把不同的元素组成一起形成集合,是python基本的数据类型.集合元素(set elements):组成集合的成员 python的set和其他语言类似, 是一个无序不重复元素集, 基本功能包括关系测试和消除重复元素. 集合对象还支持union(联合), intersection(交), difference(差)和sysmmetric difference(对称差集)

Python3.5(十)深浅拷贝问题

[可变对象-不可变对象] 在Python中不可变对象指:一旦创建就不可修改的对象,包括字符串,元祖,数字 在Python中可变对象是指:可以修改的对象,包括:列表.字典 >>> L1 = [2,3,4] #L1变量指向的是一个可变对象:列表 >>> L2 = L1 #将L1值赋给L2后,两者共享引用同一个列表对象[1,2,3,4] >>> L1[0] = 200 #因为列表可变,改变L1中第一个元素的值 >>> L1; L2 #改变后

C++模板实现动态顺序表(更深层次的深浅拷贝)与基于顺序表的简单栈的实现

前面介绍的模板有关知识大部分都是用顺序表来举例的,现在我们就专门用模板来实现顺序表,其中的很多操作都和之前没有多大区别,只是有几个比较重要的知识点需要做专门的详解. 1 #pragma once 2 #include<iostream> 3 #include<string> 4 #include<stdlib.h> 5 using namespace std; 6 7 template <class T> 8 class Vector 9 { 10 publ