JS赋值、浅拷贝和深拷贝的区别
时间: 2024-04-16 19:10:31 浏览: 126
JS赋值是将一个变量的值赋给另一个变量,两个变量最终指向同一个内存地址,修改其中一个变量的值会影响到另一个变量。
浅拷贝则是创建一个新的对象,新对象与原始对象的基本类型数据相同,但引用类型数据仍然共享同一个内存地址。当修改新对象的引用类型数据时,会影响到原始对象的引用类型数据。
深拷贝是创建一个全新的对象,与原始对象完全独立,不共享任何内存地址。无论是基本类型还是引用类型数据,都是全新的,修改新对象的任何属性都不会影响到原始对象。
需要注意的是,在深拷贝对象中,如果对象中有函数、正则表达式等特殊类型数据,需要特殊处理才能保证深拷贝的完整性。
相关问题
js赋值、浅拷贝和深拷贝(数组和对象的深浅拷贝)实例详解
赋值是指将一个变量的值赋给另一个变量,二者指向同一个内存地址。示例代码如下:
```
let a = [1, 2, 3];
let b = a;
console.log(a); // [1, 2, 3]
console.log(b); // [1, 2, 3]
b.push(4);
console.log(a); // [1, 2, 3, 4]
console.log(b); // [1, 2, 3, 4]
```
上述代码中,由于b直接指向了a的内存地址,所以对b进行修改也会影响到a。这就是赋值的情况。
浅拷贝是指创建一个新的对象或数组,但只复制了对象或数组的引用,而不是复制其中的内容。示例代码如下:
```
let obj = {name: 'Alice', age: 20};
let copy = Object.assign({}, obj);
console.log(obj); // {name: 'Alice', age: 20}
console.log(copy); // {name: 'Alice', age: 20}
copy.age = 25;
console.log(obj); // {name: 'Alice', age: 20}
console.log(copy); // {name: 'Alice', age: 25}
```
在上述代码中,通过`Object.assign`方法将obj的属性复制到新对象copy中,但是只是复制了引用,并没有复制其中的属性值。因此,对copy进行修改不会影响到原来的obj对象。
深拷贝是指创建一个新的对象或数组,并且递归地复制了对象或数组的所有内容,包括嵌套的对象和数组。示例代码如下:
```
let arr = [1, 2, [3, 4]];
let deepCopy = JSON.parse(JSON.stringify(arr));
console.log(arr); // [1, 2, [3, 4]]
console.log(deepCopy); // [1, 2, [3, 4]]
deepCopy[2][0] = 5;
console.log(arr); // [1, 2, [3, 4]]
console.log(deepCopy); // [1, 2, [5, 4]]
```
在上述代码中,通过`JSON.stringify`和`JSON.parse`方法实现了深拷贝。新的deepCopy数组完全独立于原来的arr数组,因此对deepCopy进行修改不会影响到原来的arr数组。
总结起来,赋值只是简单地将变量的值赋给另一个变量,二者指向同一个内存地址;浅拷贝只复制了对象或数组的引用,对新对象的修改会影响到原始对象;深拷贝递归地复制了对象或数组的所有内容,新对象与原始对象完全独立。
js的浅拷贝和深拷贝方法
在JavaScript中,浅拷贝和深拷贝是指复制对象时对属性值的处理方式:
1. **浅拷贝**:它创建了一个新的引用指向原来的对象或数组,新对象只包含一层的属性或元素。如果原对象的属性是基本数据类型或简单类型的引用,如字符串、数字、布尔值等,浅拷贝会直接复制;但如果属性是复杂类型(如对象或数组),浅拷贝只会复制其引用,不会递归地复制嵌套内容。浅拷贝可以用`Object.assign()`、`Array.from()` 或简单的赋值操作符`=`来实现。
示例:
```javascript
let obj = { a: [1, 2] };
let shallowCopy = Object.assign({}, obj); // 浅拷贝
console.log(shallowCopy === obj); // true (共享了相同的引用)
```
2. **深拷贝**:深度复制会递归地复制整个对象及其所有嵌套的对象和数组,包括循环引用。这意味着每个副本都是独立的,改变其中一个不会影响到另一个。JavaScript没有内置的深拷贝函数,但可以借助第三方库如`lodash.cloneDeep()`或`JSON.parse(JSON.stringify(obj))`来实现。
示例:
```javascript
const deepClone = require('lodash.clonedeep');
let obj = { a: [1, 2], b: { c: [3, 4] } };
let deepCopy = deepClone(obj); // 深拷贝
console.log(deepCopy === obj); // false (完全独立的副本)
```
阅读全文