【问题标题】:Javascript - array connect to another [duplicate]Javascript - 数组连接到另一个[重复]
【发布时间】:2014-02-17 06:12:32
【问题描述】:

我的情况很奇怪:

当我执行该代码时:

var origin_array = [1,2,3];
var m = origin_array;
m.pop();

alert(origin_array);

origin_array 值将是 1,2 虽然我没改过

但如果我编写该代码:

var x = 5;
var y = x;
y--;

alert(x);

x 仍然是 5,从第一个示例中可以看出,它不会连接到“x”。

所以我的问题是如何使“m”数组独一无二,而不改变原始数组?

【问题讨论】:

  • 数组在 JavaScript 中通过引用传递。 m === origin_array

标签: javascript arrays unique


【解决方案1】:

您需要明确地制作origin_array 的(浅)副本或克隆:

var m = origin_array.slice(0);

对于原始值(例如字符串和数字)而言,这不是必需的。

请务必了解,尽管上述方法可以避免您遇到的问题,但如果您处理更复杂的结构,同样的情况可能会再次发生,在某些情况下,“深度克隆”是必要的。

【讨论】:

    【解决方案2】:

    数组是通过引用分配的。这意味着当你这样做时:

    var origin_array = [1,2,3];
    var m = origin_array;
    

    m 只是指向与origin_array 完全相同的数组。只有一个数组,origin_arraym 都指向它。如果您通过任一变量修改它,它们都会看到修改,因为您正在修改它们都指向的一个数组。

    在 javascript 中,对象和数组都是通过引用分配的,就像这样。分配它们不会复制。如果您希望分配生成副本,则必须显式制作副本。对于数组,这很简单:

    var origin_array = [1,2,3];
    var m = origin_array.slice(0);  // makes a shallow copy
    m.pop();
    console.log(origin_array);      // [1,2,3] because origin_array was not changed
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-20
      • 2012-04-04
      • 1970-01-01
      相关资源
      最近更新 更多