如何在javascript中保留数组?
-
06-07-2019 - |
题
这里有一些代码有两个数组(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)
您正在做的不是创建数组的副本,它只创建数组引用的副本,因此您将获得对同一数组对象的两个引用。
这是您创建数组的实际副本的方法:
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”作为“复制”这样你就可以制作副本了。
在任何一种情况下都不需要参数。切片中的参数只会使代码变大和变慢。
不隶属于 StackOverflow