js赋值、浅拷贝和深拷贝(数组和对象的深浅拷贝)实例详解
时间: 2023-09-06 21:02:34 浏览: 128
赋值是指将一个变量的值赋给另一个变量,二者指向同一个内存地址。示例代码如下:
```
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数组。
总结起来,赋值只是简单地将变量的值赋给另一个变量,二者指向同一个内存地址;浅拷贝只复制了对象或数组的引用,对新对象的修改会影响到原始对象;深拷贝递归地复制了对象或数组的所有内容,新对象与原始对象完全独立。
阅读全文