这是一些具有两个数组(np 和 op)的代码,一个是另一个的副本
但是,当我修改副本时,原来的也被修改了!看一看:
<script type="text/javascript">
var op=new Array(0, 0);
var np=op;
np[1]=2;
document.write(op+"<br>")
document.write(np)
</script>
有没有办法保留原件和修改副本?
这是一些具有两个数组(np 和 op)的代码,一个是另一个的副本
但是,当我修改副本时,原来的也被修改了!看一看:
<script type="text/javascript">
var op=new Array(0, 0);
var np=op;
np[1]=2;
document.write(op+"<br>")
document.write(np)
</script>
有没有办法保留原件和修改副本?
一些内置的 Array 函数实际上会为您创建一个副本。其中之一是切片。
例如:
var op=new Array(0, 0);
var np= op.slice(0);
np[1]=2;
document.write(op+"<br>")
document.write(np)
您从未制作过数组的副本。您只需将数组分配给另一个变量。这不会在 Javascript 中复制。在您的示例中,只有一个带有两个变量的数组,您可以通过它访问它。在 Javascript 中没有内置的方法来复制数组,因此您需要编写自己的函数来执行此操作。
查看这个 StackOverflow 问题,了解如何实际实现数组中元素的复制。
您所做的不是创建数组的副本,它只是创建对数组的引用的副本,因此您获得了对同一数组对象的两个引用。
这是创建数组的实际副本的方法:
var np = op.concat();
该concat
方法创建一个新数组,该数组是添加了任何附加项的数组的副本。如果您不指定任何其他项目,您只会获得数组的副本。
Array.prototype.copy = function() {
return this.slice(0, this.length);
}
然后
var op=new Array(0, 0);
var np=op.copy();
np[1]=2;
document.write(op+"<br>")
document.write(np)
您应该克隆第二个数组而不是复制它。
- - 更新
如果将对象分配给变量,则仅复制引用(这意味着它们都指向相同的数据)。要获得此对象的独立副本,您需要克隆它。有几种方法可以做到这一点,例如这里是使用 jQuery 克隆对象的方法。
要复制数组:
var np=op.slice();
或者
var np=op.concat();
concat 更快,而 slice 占用更少的字符。有些人将“slice”或“concat”别名为“copy”,这样更明显的是您正在制作副本。
在任何一种情况下都不需要参数。切片中的参数只会使代码更大更慢。
您可以只使用slice
返回数组副本的本机方法:
var np = op.slice(0,op.length);
第二个参数应该是可选的,但在 IE 中我认为它是必需的。
您的代码,完成更改:
var op=new Array(0, 0);
var np=op.slice(0,op.length);
np[1]=2;
document.write(op+"<br>")
document.write(np)
要创建一个新数组,您可能需要考虑:
var op = [];