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将字符串和数字复制 到新数组中.对一个数组中的字符串或数字的更改不会影响另一个数组.
如果将新元素添加到任一阵列,则另一个阵列不受影响.
小智 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:我的英语很差:)