如何用另一个扩展现有的js-array?

时间:2014-09-24 14:16:51

标签: javascript arrays extend

我发现了this个问题,但遗憾的是它刚刚关闭。有很多好的答案,但我想知道为什么没有人提出以下解决方案:

a = a.concat(b)

作者说他不想要一个新阵列但是扩展阵列a。

1 个答案:

答案 0 :(得分:1)

将局部变量设置为值并不一定意味着将传播到引用变量的所有位置。举个例子:



var foo = (function() {
  var bar = [1, 2, 3, 4, 5];
  return {
    get: function() {
      return bar;
    },
    show: function() {
      $("html").append("<div>" + bar.length + "</div>");
    }
  };
})();

var a = foo.get();
foo.show();

a = foo.get();
a = a.concat([6, 7]);
foo.show();

a = foo.get();
a.push([6, 7]);
foo.show();
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>
&#13;
&#13;
&#13;

show的第二次调用打印&#34; 5&#34;,因为bar未修改a = a.concat。由于abar是引用,因此当您将a设置为bar.concat的返回值时,会生成bar的副本并将其分配给{{1} }}。位置a引用不会更改,数组的内容也不会更改为bar

当重新分配一个引用时,它不会传播到引用bar的每个地方(如果有的话,复制将几乎不可能)。


在这种情况下,了解哪些数组方法最有用,您可能barpush。它取决于确切的用途(在特定索引处追加或插入,一次删除现有元素,或从另一个数组中删除)。

Splice可以在数组中做一些有趣的事情,并且具有返回被删除元素的有趣属性。它可以插入和替换元素,具体取决于提供的参数。

Push就是这样做,将元素附加到数组的末尾,就好像它是一个列表一样。如果您有另一个数组,splice是一种将它们组合起来的便捷方式。

如果您有权访问Underscore.js,那么其中的许多收集方法都很有用。它们通常会返回一个新数组,但提供it.push.apply(other)flatten等功能。