JS与函数参数相同的对象

时间:2013-03-26 00:22:51

标签: javascript object

jiddle - 我的函数创建了x*y array,其默认值为value。我希望这个值是2长的数组。但似乎通过将new Array(2)作为parameter传递它始终传递相同的对象,因此稍后更改数组中的任何单元格都会影响所有这些对象。如何使此数组的每个default值与每个单元格相同,但independent也是如此。

在fidle上我改变某些字段的值并提醒依赖于第一个字段的其他字段,因为每个单元格都有默认值作为同一个对象。

1 个答案:

答案 0 :(得分:1)

  

我已经创建了具有一些默认值的x*y数组的函数。我希望这个值是一个2长的数组

但是它不再是x*y二维数组,而是一个x*y*2三维数组!为此,你需要一个不同的功能。

  

似乎通过传递new Array(2)作为参数,它总是传递相同的对象,因此稍后更改数组中的任何单元格都会影响所有这些对象。

是。 new Array(2)创建一个对象,并且您的代码构造一个二维数组,每个字段都指向它。

  

如何让他们独立?

您需要使用其他功能,例如

function newB(x, y, z) {
    var result = new Array(x);
    for (var i=0; i<x; i++) {
        result[i] = new Array(y);
        for (var j=0; j<y; j++) {
            result[i][j] = new Array(z);
        }
    }
    return result;
}

var fields = newA(5, 5, 2);

或者为了使它更通用,你可以使用一些工厂函数作为参数,它构造独立的值:

function newB(x, y, valuemaker) {
    if (typeof valuemaker != "function") {
        var value = valuemaker || 0;
        valuemaker = function(){ return value; };
    }
    var result = new Array(x);
    for (var i=0; i<x; i++) {
        result[i] = new Array(y);
        for (var j=0; j<y; j++) {
            result[i][j] = valuemaker();
        }
    }
    return result;
}

var fields = newA(5, 5, function() {
    return new Array(2);
});