js中的浅拷贝与深拷贝

拷贝什么东西

如果是原始数据类型,那没有什么好拷贝的,直接赋值一个新的变量即可。
如果是引用数据类型,譬如对象或数组、或者我们经常用到的json,事情才有挑战性。
首先我们确定了要拷贝的是对象(js中万物皆对象)

why:为什么需要拷贝对象?

需求:有一个对象A,我们想操作并修改对象A的属性,但又不想影响对象A。
听起来觉得有点矛盾啊,举个例子你就明白了。
19世界欧洲各大城市马车无处不在,加速了人们出行的速度但却给城市的卫生带来极大的影响(马粪无处不在)。
随后各国政府想了各种方案都无法解决马粪问题,直到汽车的出现。
汽车拥有比马车更快的速度,同时还不会对卫生产生影响。
需求:有一辆马车,我们想要马车的速度和城市的卫生,我们不能为了城市的卫生而不给马儿吃草,或者不让马儿拉屎吧。
又想马儿跑,又不给马儿吃草,这怎么可能。
怎么办呢?
我们弄了一个马车的拷贝,基于这个拷贝我们发明了汽车,他沿袭了马车的速度,但改掉了马车吃草的习惯。
回到我们的需求:有一个对象A,我们想操作并修改对象A的属性,但又不想影响对象A。

How:制作一份对象A的拷贝而不是引用。

首先我们需要弄明白浅层对象和深层对象。
浅层对象,即普通的数组、对象、json,不涉及嵌套;
···
var arr = [1,2,3,”hu”]
var obj = {name:”huluoyang”,index:7}
var json = [{name:”hu”,index:2},{name:”luoyang”,index:3}]
var extend = function(result,source){
for (var key in source){
result[key] = source[key]
}
return result;
}
var copy = extend({},arr)
arr[3]=”gu”;
arr[4][1]=6;
obj.index[1]=7;
json[1].index[1]=6;
···
深层对象,即复杂的数据、对象、json,涉及嵌套。
···
var arr = [1,2,3,”hu”,[4,5],{name:”huluoyang”,index:[5,{}]}]
var obj = {name:”huluoyang”,index:[6,7]}
var json = [{name:”1”,index:[2,3]},{name:”2”,index:[4,5]}]
//即我们修改的属性,它的值本身是一个原始数据类型。
arr[3]=”gu”;
arr[4][1]=6;
obj.index[1]=7;
json[1].index[1]=6;