这里有一些代码有两个数组(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>

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

有帮助吗?

解决方案

你从未制作过该阵列的副本。您只需将数组分配给另一个变量。这不会在Javascript中复制。在您的示例中,只有一个包含两个变量的数组,您可以通过它们访问它。在Javascript中没有内置的方法来复制数组,所以你需要编写自己的函数来完成它。

请参阅此StackOverflow问题,了解有关如何实际实施的提示复制数组中的元素。

其他提示

一些内置的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

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

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

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克隆对象的方式。

您可以使用返回数组副本的本机 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 = [];

要复制数组:

var np=op.slice();

var np=op.concat();

concat更快,而切片占用少一个字符。有些人别名“切片”或“concat”作为“复制”这样你就可以制作副本了。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top