【问题标题】:How to retain array in javascript?如何在javascript中保留数组?
【发布时间】:2009-11-28 17:00:29
【问题描述】:

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

有什么办法可以保留原件并修改副本?

【问题讨论】:

  • 首选“var op=[0,0]”,而不是“var op=new Array(0,0)”。

标签: javascript arrays retain


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    查看this StackOverflow question 以获取有关如何实际实现数组中元素复制的提示。

    【讨论】:

    • 不是绝对必要的,如果使用数组,请参阅下面我更简单的示例。对于对象,您需要使用引用的解决方案。
    • 您链接到的问题没有提供复制数组的解决方案。
    • @J-P:我说“复制数组中的元素”,以防他将来尝试使用 JS 对象执行此操作。看在后代的份上,你看。
    【解决方案3】:

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

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

    var np = op.concat();
    

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

    【讨论】:

      【解决方案4】:
      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)
      

      【讨论】:

        【解决方案5】:

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

        --- 更新

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

        【讨论】:

        • 哦,来吧。这就像说“你应该做正确的事”而不说正确的事情是什么。
        • 我什至不明白这个答案。 @Igor,你能澄清一下吗?
        【解决方案6】:

        您可以只使用返回数组副本的原生 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)
        

        【讨论】:

        • 不,这两个参数都不需要,即使对于 IE。参数只是让操作变大变慢。
        • 根据本文档,第一个参数是必需的,第二个是可选的。 msdn.microsoft.com/en-us/library/26ts046k.aspx
        • @Guffa:在任何浏览器中实际上都不需要。
        【解决方案7】:

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

           var op = [];
        

        【讨论】:

        • var op=[0,0] 在这种情况下。对象字面量优先于“新”。
        【解决方案8】:

        复制一个数组:

        var np=op.slice();
        

        var np=op.concat();
        

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

        在这两种情况下都不需要参数。 slice 中的参数只会让代码变大变慢。

        【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-12-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-04
        • 2014-09-22
        • 2023-01-22
        相关资源
        最近更新 更多