Javascript通过引用或值传递变量

时间:2012-01-30 12:33:28

标签: javascript reference

我有两个数组

arr1 = new Array();
arr2 = new Array();

如果我执行以下操作:

arr1 = arr2;
在JavaScript中的

是按值或按引用分配的吗?我的意思是,在完成上述操作后,arr2的进一步变化会影响arr1的内容,还会反过来吗?

4 个答案:

答案 0 :(得分:3)

为什么不自己创建测试用例,例如

arr1 = new Array();
arr2 = new Array();

arr1.push('bob');
arr2.push('joan');

alert(arr1); // Shows "bob"
alert(arr2); // Shows "joan"

arr1 = arr2;

arr2.push("jacob");
arr1.push("goliath");

alert(arr1); // Shows "joan", "jacob", "goliath"
alert(arr2); // Also shows "joan", "jacob", "goliath"

所以arr1引用arr2(在将arr2赋值给arr1之后)并包含“joan”。然后我们推“jacob”和“goliath”,但最后一个警告显示“joan”,“jacob”和“goliath” - 因为Arrays是对象,arr1和arr2在程序结束时指向同一个Object。

答案 1 :(得分:2)

在javascript数组中是对象。所以,简而言之,是的,你将通过参考。

arr1 = new Array();
arr2 = new Array();
arr1 = arr2;
arr1.push('test');
alert(arr2[0]);//test

如果你想按值传递它,你应该创建一个克隆函数,如:

function cloneValue(value){
   if (typeof value != 'object')
     return value;
   else {
     var newObj = {};
     for (var prop in value){
       newObj[prop] = value[prop];
     }
     return newObj;
   }
}

function cloneArray(array){
  var newArray = [];
  for(var i = 0; i < array.length; i++){
    newArray[i] = cloneValue(array[i]);
  }
  return newArray;
}

var arr2 = cloneArray(arr1);

这仍然有一个特权,如果数组中的值不是原始值,它们将再次通过引用传递...

我编辑了代码......

答案 2 :(得分:2)

您的案例使用 arr2 持有的对象/数组设置 arr1 。因此,现在 arr1 中的任何更改(如设置索引)都将修改先前在 arr2 中创建的数组。

答案 3 :(得分:0)

这是我写的克隆函数......

            /**
         * Clone an Object or Array.
         * 
         * @param {Object}
         *          obj the Object or Array that should be cloned
         * @param {Boolean}
         *          deep if true also clones the elements of an Object or Array,
         *          default is true
         * @return
         * @type Object
         */
        function cloneObject(obj, deep) {
            try {
                deep = !deep ? false : true;
                if (obj.constructor === Object) {
                    var nObj = {}, elem = null;
                    for (elem in obj) {
                        if (obj.hasOwnProperty(elem)) {
                            nObj[elem] = deep ? cloneObject(obj[elem]) : obj[elem];
                        }
                    }
                    return nObj;
                }
                if (obj.constructor === Array) {
                    var nArr = [], i = 0;
                    for (i = 0; i < obj.length; i++) {
                        nArr[i] = deep ? cloneObject(obj[i]) : obj[i];
                    }
                    return nArr;
                }
            } catch (e) {
                console.error("cloneObject(", arguments, ") >", e);
            }
            return obj;
        };