拼接正在影响之前复制的变量[重复]

2024-01-07

可能的重复:
在javascript中按值复制数组 https://stackoverflow.com/questions/7486085/copying-array-by-value-in-javascript

我有一个关于 javascript 的有趣问题。我复制一个数组变量以仅对副本进行修改,然后拼接副本以删除元素。然而,原始数组变量受到拼接的影响 - 就好像副本是“按引用复制”:

window.onload = function() {
  var initial_variable = ['first', 'second', 'third'];
  var copy_initial_variable = initial_variable;
  copy_initial_variable.splice(0, 1);
  alert('initial variable - ' + initial_variable);
};
//output: initial variable - second,third

firstly,这是 javascript 的故意行为还是一个错误?

其次,我如何制作数组的副本并删除副本中但不删除原始元素中的元素?

有一件事让我认为上面的内容可能是一个 JavaScript 错误,那就是这种行为只发生在数组上,而不是整数上。例如:

window.onload = function() {
  var initial_variable = 1;
  var copy_initial_variable = initial_variable;
  copy_initial_variable = 2;
  alert('initial variable - ' + initial_variable);
};
//output: initial variable - 1

如果行为一致那么这应该输出2因为该作业可能是通过引用进行的?


这绝不是一个错误,而是一个非常常见的误解。让我们看看当我说时会发生什么

var a = b;

整数和其他 JavaScript 基元,如浮点数和布尔值,是“按值分配”的。 这意味着无论什么值bhas 将被复制到a。对于计算机来说,这意味着拥有可以存储的部分内存b复制到内存的引用a参考。这就是您所期待的行为。

当数组和其他对象(以及一个的“后代”)new Object()call) 都是这样使用的,有一个引用副本。这意味着值a现在引用的值b, 记忆b引用不会被复制或修改。因此,在写作时

a = [1,2,3];
b = a;

b and a变得可以互换。他们引用相同的内存地址。要实现您想要做的事情,请使用

var copy_initial_variable = initial_variable.slice(0);

Read JavaScript 是否通过引用传递? https://stackoverflow.com/questions/13104494/does-javascript-pass-by-reference了解更多信息。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

拼接正在影响之前复制的变量[重复] 的相关文章

随机推荐