浅拷贝与深拷贝

158 阅读3分钟

1、概念 深拷贝与浅拷贝在其它语言中也经常被提及到,因为它们分别对应着值拷贝与引用拷贝。

深拷贝:从字面上的意思理解,是指很深的拷贝,到底有多深呢?深到不仅拷贝值,而且还独立开辟了一个空间。我的理解是:拷贝的过程中,独立地开辟了一个空间,这个对象指向这个地址,与原来的对象互不干扰。深拷贝也被称为值拷贝。

浅拷贝:从字面上的意思理解,是指比较浅的拷贝,它与原来的变量仍然指向同一个地址,两者之间相互影响,即其中一个改变会影响另一个的改变。浅拷贝也被称为引用拷贝,引用的意思就是取了个别名,例如张三是大名,狗蛋是他的引用,即为小名,张三变了,狗蛋自然也变了,因为他们本质上就是指同一个人。

2、js中的深拷贝(值拷贝)

js中的基本数据类型:String Number Boolean Null Undefined,在赋值的过程中都是值拷贝。

例如,let a = 10 ; b = a , 修改其中一个变量的值,不会影响到另一个变量的值。

3、js中的浅拷贝(引用拷贝) js中的对象数据类型:Object Array Function Map Set,在赋值过程中都是引用拷贝

let obj = {

 name: '张三',
 age: 3,
 height: 100
 let obj2 = obj
 obj2.name = '李四'
 console.log(obj)    // {name: '李四', age: 3, height: 100}
 console.log(obj2)   // {name: '李四', age: 3, height: 100}

} 4、将浅拷贝转换成深拷贝

在实际的项目开发过程中,我们在多数情况下不希望将对象进行浅拷贝,因为值会相互影响,容易出错。这里

主要讲js中的Array和Object类型从浅拷贝转换成深拷贝。

4.1 Array的深拷贝

4.1.1 通过slice方法

slice()操作数组时,不会对原数组有影响,会产出一个新的数组。

let arr1 = [1, 42, 5, 6]

let arr2 = arr1.slice()

arr2[0] = 100

console.log(arr1) // [1, 42, 5, 6]

console.log(arr2) // [100, 42, 5, 6]

1 2 3 4 5 数组arr2的改变未引起arr1的变化

4.1.2 通过concat方法

数组的concat()方法,能够连接两个数组,同样不会改变原来的数组。用一个空数组连接另一个数组,即可实现深拷贝。

let arr3 = ['cat', 'dog', 'pig']

let arr4 = [].concat(arr3)

arr3[2] = 'big pig'

console.log(arr3) // ['cat', 'dog', 'big pig']

console.log(arr4) // ['cat', 'dog', 'pig']

1 2 3 4 5 4.1.3 通过ES6语法中 … ES6语法中的 …, 我经常在数组的深拷贝中用到。

let arr5 = [0, 0, 1]

let arr6 = [...arr5]

arr5[0] = 10000

console.log(arr5) // [10000, 0, 1]

console.log(arr6) // [0, 0, 1]

1 2 3 4 5 4.1.4 通过Array.from方法

Array.from()方法能从一个类似数组或可迭代对象中返回一个新的数组实例。通过Array.from()方法能获取到一个数组的深拷贝。

let arr7 = [1, 2, 3]

let arr8 = Array.from(arr7)

arr7[1] = 1000

console.log(arr7) // [1, 1000, 3]

console.log(arr8) // [1, 2, 3]

1 2 3 4 5 4.2 Object的深拷贝

4.2.1 通过Object.assign()方法

ES6的Object.assign() Object.assign(target, …sources)用于对象的合并,将源对象中的所有可枚举属性,复制到目标对象中,并返回合并后的目标对象。后来的源对象的属性值,将会覆盖它之前的对象的属性。

let person = {

 name: 'xia',
 age: 25,
 height: 160

}

let otherPerson = Object.assign({}, person) person.age = 30

console.log(person) console.log(otherPerson)