Массив JavaScript передается как ref, но не может присвоить ref новому массиву? - PullRequest
0 голосов
/ 06 ноября 2018

Если я передам массив в функцию и внесу изменения в массив внутри функции, массив, существующий вне функции, отражает эти эффекты. E.g.:

var myArr = [1, 2, 3];
function popAll(arr) {
    while(arr.length) {
        arr.pop();
    }
}
popAll(myArr);
console.log(myArr.length); // prints "0"

Однако, если я пытаюсь переназначить ссылку на массив, чтобы он указывал на другой массив в функции, он не привязывается:

var myArr = [1, 2, 3];
function reassign(arr) {
    while(arr.length) {
        arr.pop();
    }
    var newArr = [1,2,3,4,5];
    arr = newArr;
}
reassign(myArr);
console.log(myArr.length); // still prints "0"!!

Чего мне не хватает? Я хочу reassign(...) назначить ссылку на новый массив.

Edit:

Я не хочу возвращать новый массив. Я хочу переназначить входящую ссылку. Кроме того, я хочу узнать, почему JS имеет такое поведение, которое кажется непоследовательным (или я недостаточно знаю, чтобы понять, как оно непротиворечиво).

Ответы [ 2 ]

0 голосов
/ 06 ноября 2018

Все вызовы функций в JavaScript передаются по значению.

Это может показаться нелогичным, но имеет больше смысла, если учесть, что параметр arr сам по себе является ссылкой, поэтому это ссылка, передаваемая по значению. Присвоение newArr arr не изменит старую ссылку, она просто изменит то, что arr ссылки в рамках функции.

Как указал Зеб Ронсли в комментариях , вы должны вернуть новую ссылку из функции и присвоить внешней переменной возвращаемое значение:

var myArr = [1, 2, 3];

function reassign(arr) {
    while(arr.length) {
        arr.pop();
    }
    var newArr = [1,2,3,4,5];
    return newArr;
}

myArr = reassign(myArr);

console.log(myArr.length);

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

var myArr = [1, 2, 3];

function reassign() {
    return [1,2,3,4,5];
}

myArr = reassign();

console.log(myArr.length);
0 голосов
/ 06 ноября 2018

Вы не можете присвоить значение массива другому массиву, но вы можете добавить элементы из одного массива в другой.

Это должно помочь вам:

var myArr = [1, 2, 3];
function reassign(arr) {
    while(arr.length) {
        arr.pop();
    }
    var newArr = [1,2,3,4,5];
    for(var num in newArr){
        arr.push(num);
    }
}
reassign(myArr);
console.log(myArr.length); //prints 5
...