赋值和拷贝的概念辨析

249 阅读2分钟

一、赋值的概念

赋值是将一个变量的值赋给另一个变量,它并不是拷贝哦 。

二、赋值的行为

  • 对于基本数据类型(如数字、字符串、布尔值),赋值会将值复制给新变量。例如:

收起

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

四、总结

  • 赋值只是将一个变量的引用或值赋给另一个变量,对于引用类型,它不创建新对象,而拷贝是创建一个新的对象或数组,根据拷贝的深浅不同,对引用类型的处理也不同。