我有这个结构:
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
。
编辑以使问题更清晰:如何传递值而不是引用?
答案 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);