在 JavaScript 中引用和复制变量
在本文中,我们将讨论 JavaScript 中的按值传递和按引用传递。
JavaScript 总是按值传递,但在数组或对象中,值是对它的引用,因此您可以“更改”数据。 JavaScript 有 5 种按值传递的原始数据类型,它们是Boolean 、 NULL 、 undefined 、 String和Number 。它有 3 种通过引用传递的非原始数据类型,它们是Array 、 函数和Object 。在非原始数据类型中,我们在复制数据时遇到了一些挑战。正如我们所知,对象是在计算机内存中的某个位置创建的。当我们声明任何属性时,它会在内存中创建一个空间。
示例:地址是一种按值传递的数据类型,就像数字、字符串和地址指向内存中的位置一样。
如果是数字,则按值传递。
输出:
100 100
200 100
在字符串的情况下按值传递
输出:
sam sam
xyz sam
在数组的情况下通过引用传递
输出:
["Sam", "Sarah", "Ryan", "Poppy"]
["Sam", "Sarah", "Ryan", "Poppy"]
现在,如果您更改“团队”数组中的数据,它也会影响“玩家”数组
输出:
["Sam", "Sarah", "Ryan", "Poppy"]
["Sam", "Sarah", "Ryan", "xyz"]
这是一个数组引用,而不是数组副本。它们都指向同一个数组。
我们有 4 种方法可以做到这一点。通过使用这些方法,主阵列不会改变。
- 通过使用 slice() 方法:
输出:
["Sam", "Sarah", "Ryan", "Poppy"] ["Sam", "Sarah", "west", "Poppy"]
- 通过使用 concat() 方法:创建一个新的数组变量,然后将旧的变量连接到新的数组中。
输出:
["Sam", "Sarah", "Ryan", "Poppy"] ["Sam", "Sarah", "hell", "Poppy"]
- 通过使用 ES6 扩展运算符:
输出:
["Sam", "Sarah", "Ryan", "Poppy"] ["Sam", "Sarah", "Ryan", "heeee hawww"]
- 通过使用 Array.from():
输出:
["Sam", "Sarah", "Ryan", "Poppy"] ["Sam", "Sarah", "Ryan", "kim"]
在对象中通过引用传递:对象也是如此,它也会影响原始对象。
const person = {
name: 'loren isum',
age: 80
};
const captain = person;
person.age = 25;
console.log(captain, person);
输出:
{name: "loren isum", age: 25}
{name: "loren isum", age: 25}
有两种方法可以做到这一点。
- 通过使用 assign() 方法:
输出:
{name: "loren isum", age: 78, number: 99} {name: "loren isum", age: 80}
- 通过使用传播运算符:
输出:
{name: "loren isum", age: 78} {name: "loren isum", age: 80}
您还需要考虑在相等和相等运算符的情况下会发生什么。当我们在引用类型变量上使用这些运算符时,它们会检查引用。如果该属性引用了同一项目,则比较将输出为“true”,否则将返回“false”。
输出:
true
输出:
false
这可以通过对数组进行字符串化来纠正。
输出:
true
我们可以更改对象 person 的 name 属性,但我们无法重置引用 person,因为它已被标记为const。
输出:
false
但是我们可以通过对数组进行字符串化来纠正这个问题。
输出:
true
在函数的情况下通过引用传递:如果我们在函数中传递对象,它将改变两个对象。
输出:
{ name: 'xyz', age: 25 }
{ name: 'xyz', age: 25 }
我们可以通过解析和字符串化对象来解决这个问题。
输出:
{ name: 'xyz', age: 30 }
{ name: 'xyz', age: 25 }