可能重复:
在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)
b和a变得可以互换.他们引用相同的内存地址.要实现您想要做的事情,请使用
var copy_initial_variable = initial_variable.slice(0);
Run Code Online (Sandbox Code Playgroud)
阅读JavaScript是否通过引用传递?欲获得更多信息.