如何传递值而不是数组的引用?

时间:2012-02-08 09:22:37

标签: javascript object

我有这个结构:

var a = [];
a.push({"level": 1, "column": 4, "parent": "none", "title": "Node 0", "content": "Parintele suprem", "show": "1"});
var b = a;

a.push({"level": 1, "column": 5, "parent": "none", "title": "Node 1", "content": "Parintele suprem", "show": "1"});

console.log(b);

现在问题是b的确切内容为a(第二次推送后的内容)。这表明(如果我错了,请纠正我),当我说b = a时,我实际上给了b相同的引用,所以无论我在a中做了什么,我都在b。问题是我需要传递价值。所以我有预览a,价值在b

编辑以使问题更清晰:如何传递值而不是引用?

5 个答案:

答案 0 :(得分:15)

我认为您可以使用它来复制值而不是引用:

var b = a.slice(0);  

修改
正如评论中提到的那样,这里也提到了:https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/slice

slice 不会更改原始数组,但会返回一个新的“一级深度”副本,其中包含从原始数组中截取的元素的副本。原始数组的元素将复制到新数组中,如下所示:

  • 对于对象引用(而不是实际对象),切片副本 对象引用到新数组中。原始数组和新数组 引用同一个对象。如果引用的对象发生更改,则更改 对新的和原始数组都可见。

  • 对于字符串和数字(​​不是String和Number对象),切片副本 字符串和数字到新数组中。更改字符串或 一个数组中的数字不会影响另一个数组。

如果将新元素添加到任一阵列,则另一个阵列不受影响。

答案 1 :(得分:7)

您可以按照以下方式实施 clone 方法:

function clone(source) {
    var result = source, i, len;
    if (!source
        || source instanceof Number
        || source instanceof String
        || source instanceof Boolean) {
        return result;
    } else if (Object.prototype.toString.call(source).slice(8,-1) === 'Array') {
        result = [];
        var resultLen = 0;
        for (i = 0, len = source.length; i < len; i++) {
            result[resultLen++] = clone(source[i]);
        }
    } else if (typeof source == 'object') {
        result = {};
        for (i in source) {
            if (source.hasOwnProperty(i)) {
                result[i] = clone(source[i]);
            }
        }
    }
    return result;
};

然后:

var b = clone(a);

如果你确定a是数组,只能使用Niklas的:

var b = a.slice();

ps:我的英语很差:)。

答案 2 :(得分:3)

是的,这就是参考分配在javascript中的工作方式。你想克隆对象来制作一个副本,遗憾的是它比它应该更复杂。像MooTools这样的框架提供了最简单的解决方案,或者您可以推出自己的clone功能。

答案 3 :(得分:2)

我能找到的最简单的方法是只创建一个json字符串,然后解析数据。

var assiging_variable = JSON.parse(JSON.stringify(source_array));

如果源数组是多维数组,此方法也适用,array.slice(0)方法不适用于多维数组。

答案 4 :(得分:0)

我通过使用“Object.assign({}, source_object)”找到了一个更好的方法:

let source_obj  = {val1:"A",val2:"B"};
let copy_obj = Object.assign({}, source_obj);