一、赋值的概念
赋值是将一个变量的值赋给另一个变量,它并不是拷贝哦 。
二、赋值的行为
-
对于基本数据类型(如数字、字符串、布尔值),赋值会将值复制给新变量。例如:
收起
javascript
let a = 5;
let b = a;
a = 10;
console.log(b); // 输出 5
-
这里,
b得到的是a的值,当a的值改变时,b的值不受影响,因为基本数据类型是存储在栈内存中的,赋值是直接复制值。 -
对于引用数据类型(如对象、数组),赋值只是复制了引用,而不是对象本身。例如:
收起
javascript
let obj1 = { name: 'Alice' };
let obj2 = obj1;
obj2.name = 'Bob';
console.log(obj1.name); // 输出 'Bob'
-
这里,
obj2只是obj1的引用,它们指向堆内存中的同一个对象。当obj2修改对象的属性时,obj1也会受到影响,因为它们指向的是同一个对象。
三、与拷贝的区别
-
浅拷贝:
-
浅拷贝会创建一个新的对象或数组,但对于引用类型,只复制引用。
-
例如:
-
收起
javascript
let original = { name: 'Alice', hobbies: ['reading','swimming'] };
let shallowCopy = {...original };
shallowCopy.hobbies.push('painting');
console.log(original.hobbies); // ['reading','swimming', 'painting']
-
浅拷贝会复制
original对象,但hobbies数组只是复制了引用,修改shallowCopy的hobbies会影响original的hobbies。 -
深拷贝:
-
深拷贝会创建一个全新的对象或数组,递归复制内部的引用类型。
-
例如:
-
收起
javascript
let original = { name: 'Alice', hobbies: ['reading','swimming'] };
let deepCopy = JSON.parse(JSON.stringify(original));
deepCopy.hobbies.push('painting');
console.log(original.hobbies); // ['reading','swimming']
-
深拷贝会复制
original对象及其内部的hobbies数组,修改deepCopy的hobbies不会影响original的hobbies。
四、总结
- 赋值只是将一个变量的引用或值赋给另一个变量,对于引用类型,它不创建新对象,而拷贝是创建一个新的对象或数组,根据拷贝的深浅不同,对引用类型的处理也不同。