js 浅拷贝和深拷贝
时间: 2023-11-11 19:58:37 浏览: 125
JS中的浅拷贝和深拷贝是指在复制对象时,是否复制对象内部的引用类型数据。浅拷贝只复制对象的引用,而不是对象内部的数据,因此当原对象内部的数据发生变化时,浅拷贝出来的对象也会发生变化。深拷贝则是完全复制了对象内部的数据,因此即使原对象内部的数据发生变化,深拷贝出来的对象也不会受到影响。
JS中实现浅拷贝的方法有:Object.assign()、展开运算符(...)、Array.prototype.slice()等。实现深拷贝的方法有:JSON.parse(JSON.stringify())、递归复制等。
需要注意的是,使用JSON.parse(JSON.stringify())进行深拷贝时,会忽略掉对象中的函数、undefined、Symbol等数据类型。
相关问题
前端 深拷贝和浅拷贝
前端中的深拷贝和浅拷贝是用于复制对象或数组的概念。
浅拷贝是指创建一个新的对象或数组,然后将原始对象或数组的引用复制给新对象或数组。这意味着当你修改新对象或数组时,原始对象或数组也会被修改。实现浅拷贝的方法有多种,如使用 `Object.assign()`、扩展运算符 `...` 或者 `Array.prototype.slice()` 等。
例如,使用扩展运算符进行浅拷贝:
```javascript
const originalObj = { a: 1, b: { c: 2 } };
const shallowCopy = { ...originalObj };
shallowCopy.a = 3;
shallowCopy.b.c = 4;
console.log(originalObj); // { a: 1, b: { c: 4 } }
console.log(shallowCopy); // { a: 3, b: { c: 4 } }
```
深拷贝则是在创建新对象或数组时,递归地复制原始对象或数组中的所有值,从而创建一个完全独立的副本。这意味着修改新对象或数组不会影响原始对象或数组。常见的实现深拷贝的方法有使用递归、`JSON.parse(JSON.stringify())` 或者第三方库如 `lodash` 的 `cloneDeep()`。
例如,使用`JSON.parse(JSON.stringify())`进行深拷贝:
```javascript
const originalObj = { a: 1, b: { c: 2 } };
const deepCopy = JSON.parse(JSON.stringify(originalObj));
deepCopy.a = 3;
deepCopy.b.c = 4;
console.log(originalObj); // { a: 1, b: { c: 2 } }
console.log(deepCopy); // { a: 3, b: { c: 4 } }
```
需要注意的是,使用 `JSON.parse(JSON.stringify())` 的方式存在一些限制,例如无法复制函数、循环引用等。在实际应用中,需要根据需求选择合适的方法进行拷贝。
js深拷贝和浅拷贝
JS中的数据类型分为两种:基本数据类型和引用数据类型。
基本数据类型包括:Number、String、Boolean、null、undefined、。
引用数据类型包括:Object、Array、Function等。
在JS中,对于基本数据类型的赋值、传参等操作,都是按值传递的,即复制一份值到新的变量中。而对于引用数据类型,赋值、传参等操作则是按引用传递的,即新的变量和原始变量指向同一个对象,对于其中一个变量的修改会影响到另一个变量。
因此,深拷贝和浅拷贝就是针对引用数据类型的复制方式而言的。
浅拷贝是指复制一个对象的引用,新的对象和原始对象共享同一块内存空间,对其中一个对象的修改会影响到另一个对象。常见的浅拷贝方式包括:Object.assign()、Array.slice()、Array.concat()等。
例如:
```
let obj1 = {a: 1, b: 2};
let obj2 = obj1;
obj2.a = 3;
console.log(obj1); // 输出 {a: 3, b: 2}
```
深拷贝是指复制一个对象的副本,新的对象和原始对象不共享内存空间,对其中一个对象的修改不会影响到另一个对象。常见的深拷贝方式包括:JSON.parse(JSON.stringify())、递归复制等。
例如:
```
let obj1 = {a: 1, b: {c: 2}};
let obj2 = JSON.parse(JSON.stringify(obj1));
obj2.b.c = 3;
console.log(obj1); // 输出 {a: 1, b: {c: 2}}
```
需要注意的是,使用JSON.parse(JSON.stringify())进行深拷贝时,会忽略对象中的函数、正则表达式等类型。此外,如果对象中存在循环引用,使用递归复制时也会导致死循环等问题。因此,在实际应用中,需要根据需要选择合适的拷贝方式。