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

zoz*_*ozo 11 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);
Run Code Online (Sandbox Code Playgroud)

现在的问题是b具有确切的内容a(第二次推送后的内容).这个建议(纠正我,如果我错了),当我说b = a我实际给了b同样的参考作为a,所以无论我做什么a我都在b.问题是我需要传递价值.所以我有预览a,有价值b.

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

Nik*_*las 15

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

var b = a.slice(0);  
Run Code Online (Sandbox Code Playgroud)

编辑
正如评论所提到的,这里也提到了:https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/slice

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

  • 对于对象引用(而不是实际对象),slice将对象引用复制 到新数组中.原始数组和新数组都引用相同的对象.如果引用的对象发生更改,则更改对新的和原始数组都可见.

  • 对于字符串和数字(​​不是String和Number对象),slice将字符串和数字复制 到新数组中.对一个数组中的字符串或数字的更改不会影响另一个数组.

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

  • +1注意`slice`的行为,如果你给它**没有**参数[未在规范中定义](http://es5.github.com/#x15.4.4.10),所以` var b = a.slice();`依赖于未指定的,未记录的行为.为了避免依赖它,只需传递`0`:`var b = a.slice(0);` (3认同)
  • 这只适用于数字索引数组,不是吗? (2认同)

小智 7

你可以实现一个克隆方法如下:

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;
};
Run Code Online (Sandbox Code Playgroud)

然后:

var b = clone(a);
Run Code Online (Sandbox Code Playgroud)

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

var b = a.slice();
Run Code Online (Sandbox Code Playgroud)

ps:我的英语很差:)