按值复制与按引用复制
引言:
在 JavaScript 中,有两种方法可以给变量赋值。理解这两种方法的运作方式对于你在代码中成功操作数据至关重要。在这篇简短的博客中,我将解释这两种方法的区别,并提供一些示例。变量要么接收被赋值的副本,要么接收被赋值的引用。
按值复制:
在使用基本数据类型(数字、字符串、布尔值、null 和 undefined)时,变量会复制其被赋值的值,并代表该特定副本。对原始数据的任何更改都不会影响已创建并存储在变量中的副本。反之亦然,存储在变量中的这些值可以进行操作,而不会影响原始数据。
在上图中,变量b被赋予了变量a中存储的值。由于变量a存储的是基本数据类型,因此b被赋予了该值的副本。之后对a所做的任何更改都不会影响b的值。a === 1 //true b === 1 //true
a = undefined;
console.log(b); // prints 1, not effected by a being reassigned.
引用复制:
在使用复杂数据类型(对象、数组、函数)时,变量不会复制其所赋值的值,而是创建一个指向该数据的引用。由于变量只是对原始数据的引用,因此对变量的任何操作都会影响原始数据。同样,对原始数据的任何更改也会影响变量。
let a = {
name: 'Object',
color: 'blue'
}
let b = a;
在上面的代码中,变量a被赋值为一个具有两个属性的对象。紧接着,我们将变量b赋值为变量a。当b被赋值时,它将被赋予对同一个对象的引用,该对象与变量a所指向的对象相同。对变量b的任何更改都会影响存储在变量a中的原始数据。b.color = 'orange'
由于两个变量都指向同一个对象,因此它们指向的对象的颜色将被赋值为“橙色”。
console.log(a); // prints {name: 'Object, color: 'orange'}
console.log(b); // prints {name: 'Object, color: 'orange'}
总而言之,
了解你正在处理的数据是副本还是引用至关重要。如果是副本,由于你的更改仅限于该副本,因此对整个程序的影响较小。而如果是引用,你的更改会影响整个数据,如果未能及时发现,可能会在后续代码中造成不必要的更改。

