JS浅拷贝和深拷贝

一、数组和对象的浅拷贝

简单的赋值就是浅拷贝。数组和对象在赋值的时候都是引用传递,只是传递一个指针。

var a = [1,2,3];
var b =a ;
var c = {name:'xuyafei', age:26};
var d = c;

console.log(a);
console.log(b);
console.log(c);
console.log(d);

console.log('----------------------------');

b[0] =5;
c.age = 27;

console.log(a);
console.log(b);
console.log(c);
console.log(d);

输出结果如下:

[1,2,3]
[1,2,3]
{ name: 'xuyafei', age: 26 }
{ name: 'xuyafei', age: 26 }
----------------------------
[5,2,3]
[5,2,3]
{ name: 'xuyafei', age: 27 }
{ name: 'xuyafei', age: 27 }

二、数组的深拷贝

方法一:js的slice函数

array对象的slice函数:arrayObj.slice(start, [end])
返回值
返回一个 Array 对象,其中包含了 arrayObj 的指定部分。(仍为数组)
参数
arrayObj:必选项。一个 Array 对象。
start:必选项。arrayObj 中所指定的部分的开始元素是从零开始计算的下标。
end:可选项。arrayObj 中所指定的部分的结束元素是从零开始计算的下标。
说明
slice 方法一直复制到 end 所指定的元素,但是不包括该元素。
如果 start 为负,将它作为 length + start处理。如果 end 为负,就将它作为 length + end 处理,此处 length 均为数组的长度。
如果省略 end ,那么 slice 方法将一直复制到 arrayObj 的结尾。
如果 end 出现在 start 之前,不复制任何元素到新数组中。

例子代码如下

var arr = ["One","Two","Three"];

var arrtoo = arr.slice(0);
arrtoo[1] = "set Map";
document.writeln("数组的原始值:" + arr + "<br />");//Export:数组的原始值:One,Two,Three
document.writeln("数组的新值:" + arrtoo + "<br />");//Export:数组的新值:One,set Map,Three

方法二:js的concat方法

concat() 方法用于连接两个或多个数组,该方法不会改变现有的数组,而仅仅会返回被连接数组的一个副本。
语法
arrayObject.concat(arrayX,arrayX,......,arrayX)
说明
返回一个新的数组。该数组是通过把所有 arrayX 参数元素添加到 arrayObject 中生成的。如果要进行 concat() 操作的参数是数组,那么添加的是数组中的元素,而不是数组。

还是不太明白?看看下面的例子就明白很多了

var arr = ["One","Two","Three"];

var arrtooo = arr.concat();
arrtooo[1] = "set Map To";
document.writeln("数组的原始值:" + arr + "<br />");//Export:数组的原始值:One,Two,Three
document.writeln("数组的新值:" + arrtooo + "<br />");//Export:数组的新值:One,set Map To,Three

三、对象的深拷贝

代码中聊

var a={name:'yy',age:26};
var b=new Object();


b.name=a.name;
b.age=a.age;
a.name='xx';
console.log(b);//Object { name="yy", age=26}
console.log(a);//Object { name="xx", age=26}

//就是把对象的属性遍历一遍,赋给一个新的对象。即:

var deepCopy= function(source) { 


    var result={};

    for (var key in source) {


        result[key] = typeof source[key]===’object’? deepCoyp(source[key]): source[key];

     } 
   return result; 
}

参考

  1. http://www.cnblogs.com/yichengbo/archive/2014/07/10/3835882.html
  2. http://blog.csdn.net/yisuowushinian/article/details/45544343
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值