Javascript передача переменных по ссылке или по значению - PullRequest
2 голосов
/ 30 января 2012

У меня есть два массива

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

Если я сделаю следующее:

arr1 = arr2;

в javascript это назначение по значению или по ссылке? Что я имею в виду, после выполнения вышесказанного, будут ли дальнейшие изменения в arr2 влиять на содержимое arr1, а также наоборот?

Ответы [ 4 ]

3 голосов
/ 30 января 2012

Почему бы не создать тестовый пример самостоятельно, например

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» - поскольку массивы являются объектами, а arr1 и arr2 указывают на один и тот же объект при завершении программы.

2 голосов
/ 30 января 2012

Ваш случай устанавливает arr1 с объект / массив , удерживаемый arr2 .По этой причине теперь любое изменение arr1 , например установка индекса, изменит массив, ранее созданный в arr2 .

2 голосов
/ 30 января 2012

В массивах 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);

у него все еще есть перк, если значения в массиве не являются примитивными, они будут переданы по ссылке снова ...

Я отредактировал код ...

0 голосов
/ 30 января 2012

Вот функция клона, которую я написал ...

            /**
         * 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;
        };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...