完全基本的Javascript参考问题

完全基本的Javascript参考问题,javascript,deep-copy,Javascript,Deep Copy,在Javascript控制台中执行以下操作: var a = {'foo': []}; var b = {}; for (var key in a) { b[key] = a[key]; } a['foo'].push(1); console.log(b); 收益率: objectfoo=[1] 我想通过b中的值为a中的每个键复制每个数组。有更简单的方法吗?更简单的方法: var a = {'foo': []}; var b = a; a['foo'].push(1); con

在Javascript控制台中执行以下操作:

var a = {'foo': []};
var b = {};

for (var key in a) {
   b[key] = a[key];
}

a['foo'].push(1);

console.log(b);
收益率:

objectfoo=[1]

我想通过b中的值为a中的每个键复制每个数组。有更简单的方法吗?

更简单的方法:

var a = {'foo': []};
var b = a;

a['foo'].push(1);

console.log(b);
输出是相同的

编辑:

var a = {'foo': []};
var b = {};

for (var key in a) {
    if (a.hasOwnProperty(key)) {
        b[key] = [];
        for (var i = 0; i < a[key].length; i += 1) {
            b[key][i] = a[key][i];
        }
    }
}

a['foo'].push(1);

console.log(b);
var a={'foo':[]};
var b={};
for(a中的var键){
如果(a.hasOwnProperty(键)){
b[键]=[];
对于(变量i=0;i
您可以创建一个“克隆”功能,根据原始对象创建一个新对象,然后克隆原始对象属性(如果它们是对象):

function clone(obj){
  if(typeof(obj) != 'object' && obj != null) 
    return obj; // return the value itself if isn't an object
                // or null, since typeof  null == 'object';

    var temp = new obj.constructor();

    for(var key in obj)
        temp[key] = clone(obj[key]);
    return temp;
}


var a = {'foo': []};
var b = clone(a);

a['foo'].push(1);

console.log(b); // Object foo=[0]
这就是所谓的。您可以在以下内容中找到示例:


因为这将在代码中添加对深度复制阵列的支持:

var a = {'foo': []};
var b = {};

for (var key in a) {
   if (Object.prototype.toString.call(b[key]) === "[object Array]") {
      b[key] = a[key].slice(0);
   } else {
      b[key] = a[key];
   }
}

a['foo'].push(1);

console.log(b);

安纳托利:我不希望b只是对a的引用;我希望b是存储在a中的数组值的唯一副本,这样当我推送到a的数组时,它不会影响b。当前输出为空数组的对象。您可以使用[key].slice(0)
简化所有深度复制内容。我以前遇到过这个问题,这正是我解决这个问题的方法+1原型打印打破了这一点。简单地
Object.prototype.foo=function(){}
将创建无限递归。@Jonathan:添加了一个if语句来停止递归。同样的问题在这里CMS:
obj.constructor()
将在构造函数中消失(
temp
将是
未定义的
),并且可能会破坏全局函数。@Crescent:完全一样的问题!,添加了
new
操作符,而我正在考虑更好的东西…如何获得“javascript控制台”?奥斯卡-使用Firefox中的Firebug或Safari的Web Inspector。@奥斯卡:你需要Firebug才能使用
console.log
函数。