1

这是一些具有两个数组(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>

有没有办法保留原件和修改副本?

4

8 回答 8

7

一些内置的 Array 函数实际上会为您创建一个副本。其中之一是切片。

例如:

var op=new Array(0, 0);
var np= op.slice(0);
np[1]=2;
document.write(op+"<br>")
document.write(np)

参考http://my.opera.com/GreyWyvern/blog/show.dml/1725165

于 2009-11-28T17:03:58.500 回答
5

您从未制作过数组的副本。您只需将数组分配给另一个变量。这不会在 Javascript 中复制。在您的示例中,只有一个带有两个变量的数组,您可以通过它访问它。在 Javascript 中没有内置的方法来复制数组,因此您需要编写自己的函数来执行此操作。

查看这个 StackOverflow 问题,了解如何实际实现数组中元素的复制。

于 2009-11-28T17:02:50.657 回答
4

您所做的不是创建数组的副本,它只是创建对数组的引用的副本,因此您获得了对同一数组对象的两个引用。

这是创建数组的实际副本的方法:

var np = op.concat();

concat方法创建一个新数组,该数组是添加了任何附加项的数组的副本。如果您不指定任何其他项目,您只会获得数组的副本。

于 2009-11-28T17:05:12.040 回答
2
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)

于 2009-11-28T17:05:01.103 回答
1

您应该克隆第二个数组而不是复制它。

- - 更新

如果将对象分配给变量,则仅复制引用(这意味着它们都指向相同的数据)。要获得此对象的独立副本,您需要克隆它。有几种方法可以做到这一点,例如这里是使用 jQuery 克隆对象的方法。

于 2009-11-28T17:04:09.187 回答
0

要复制数组:

var np=op.slice();

或者

var np=op.concat();

concat 更快,而 slice 占用更少的字符。有些人将“slice”或“concat”别名为“copy”,这样更明显的是您正在制作副本。

在任何一种情况下都不需要参数。切片中的参数只会使代码更大更慢。

于 2009-11-28T17:06:19.760 回答
0

您可以只使用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)
于 2009-11-28T17:06:23.240 回答
0

要创建一个新数组,您可能需要考虑:

   var op = [];
于 2009-11-28T17:07:48.460 回答