splice正在影响以前复制的变量

mul*_*sen 10 javascript

可能重复:
在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
Run Code Online (Sandbox Code Playgroud)

首先,这是javascript的故意行为还是一个bug?

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

有一件事让我觉得以上可能是一个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
Run Code Online (Sandbox Code Playgroud)

如果行为是一致的,那么这应该输出,2因为分配可能是参考?

FRD*_*FRD 10

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

var a = b;
Run Code Online (Sandbox Code Playgroud)

整数和其他javascript原语,如浮点数和布尔值,都是"按值分配".这意味着b具有的任何值都将被复制到a.到计算机时,它是指具有的存储器中的部分b的引用复制到该存储器一个引用.这就是你期待的行为.

new Object()像这样使用数组和其他对象(以及调用的"后代" )时,有一个引用副本.这意味着a的值引用了b的值, 不会复制或修改b引用的内存.因此,写作时

a = [1,2,3];
b = a;
Run Code Online (Sandbox Code Playgroud)

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

var copy_initial_variable = initial_variable.slice(0);
Run Code Online (Sandbox Code Playgroud)

阅读JavaScript是否通过引用传递?欲获得更多信息.