拷贝

来源:互联网 发布:手机蟑螂软件 编辑:程序博客网 时间:2024/05/29 12:54

数组的浅拷贝

var array=[1,3,5];var array_new=array;console.log(array_new);//[1,3,5]array_new[0]=7;console.log(array);//[7,3,5]

浅拷贝更改其中一个,其他都会随之改变,可以理解为知识复制了一个指针给新的数组;

数组的深拷贝

方法①:.slice(a,b)方法,复制大于等于a,小于b的数组项目

arrayObject.slice(start,end),返回一个新的数组。

start必需。规定从何处开始选取。如果是负数,那么它规定从数组尾部开始算起的位置。也就是说,-1 指最后一个元素,-2 指倒数第二个元素,以此类推。如果 end 未被规定,那么 slice() 方法会选取从 start 到数组结尾的所有元素。

var array=[1,3,5];var array_new=array.slice(0,2);console.log(array_new);//[1,3]array_new[0]=7;console.log(array);//[1,3,5]

方法②:a.concat(b),该方法不会改变现有的数组,而仅仅会返回被连接数组的一个副本。将b连接到a后面,返回一个新的数组。

var array=[1,3,5];var array_new=array.concat();console.log(array_new);//[1,3,5]array_new[0]=7;console.log(array);//[1,3,5]

对象的浅拷

对象的浅拷贝,与数组的浅拷贝相同

var obj={    name:"zh",    age:23};var obj_new=obj;console.log(obj_new);//{name: "zh", age: 23}obj_new.name="joe";console.log(obj);//{name: "zh", age: 23}

对象的另一种浅拷贝:把对象的属性遍历一遍,赋给一个新的对象。

如果一个对象中的所有属性值都是简单的值类型,要复制它很简单
ob

function easyCopy(obj){    var new_obj={};    for(var i in obj){        new_obj[i]=obj[i];    }    return new_obj;}var obj={    name:"zh",    age:23};var obj_new=easyCopy(obj);console.log(obj_new)//{name: "zh", age: 23}

但是,这样的拷贝有一个问题。那就是,如果父对象的属性等于数组或另一个对象,那么实际上,子对象获得的只是一个内存地址,而不是真正拷贝,因此存在父对象被篡改的可能。这样只是拷贝了基本类型的数据,也属于浅拷贝。

对象的深拷贝

所谓”深拷贝”,就是能够实现真正意义上的数组和对象的拷贝。它的实现并不难,只要递归调用”浅拷贝”就行了。

function deepCopy(p, c) {    var c = c || {};    for (var i in p) {      if (typeof p[i] === 'object') {        c[i] = (p[i].constructor === Array) ? [] : {};        deepCopy(p[i], c[i]);      } else {         c[i] = p[i];      }    }    return c;  }

当对象中不包含方法时,可以使用JSON对象的方法进行复制

var obj={    name:"zh",    age:[1,2,3]};var obj_new=JSON.parse(JSON.stringify(obj));console.log(obj_new);//{name: "zh", age: 23}obj_new.name="sb";console.log(obj_new);//{name: "sb", age: 23}console.log(obj);//{name: "zh", age: 23}

parse用于从一个字符串中解析出json对象,stringify()用于从一个对象解析出字符串

使用jQuery的extend方法

jQuery.extend( [deep], target, object1 [, objectN ] )

在默认情况下,通过$.extend()合并操作不是递归的(浅拷贝);如果第一个对象的属性本身是一个对象或数组,那么它将完全用第二个对象相同的key重写一个属性。这些值不会被合并。然而,如果将 true 作为该函数的第一个参数,那么会在对象上进行递归的合并(深拷贝)。

浅拷贝(false 默认):如果第二个参数对象有的属性第一个参数对象也有,那么不会进行相同参数内部的比较,直接将第一个对象的相同参数覆盖。

深拷贝(true):如果第二个参数对象有的属性第一个参数对象也有,还要继续在这个相同的参数向下一层找,比较相同参数的对象中是否还有不一样的属性,如果有,将其继承到第一个对象,如果没有,则覆盖。

浅复制

var obj={    name:"zh",    age:[1,2,3]};var obj_new={};$.extend(obj_new,obj);console.log(obj_new);obj_new.age[0]="sb";console.log(obj.age[0]);//sb

深复制

“`
var obj={
name:”zh”,
age:[1,2,3]
};
var obj_new={};
$.extend(true,obj_new,obj);
console.log(obj_new);
obj_new.age[0]=”sb”;
console.log(obj.age[0]);//1

0 0
原创粉丝点击