Javascript передача по ссылке вместо значения в этом случае? - PullRequest
2 голосов
/ 12 февраля 2020

У меня всегда было впечатление, что javascript был языком Pass By Value (где копии всех параметров функции используются внутри функций, а не редактируются внешние переменные по ссылке), поэтому я был шокирован узнайте, что выполнение кода ниже изменяет внешнюю переменную 'свое значение.

var one = [1];
var two = [2];

function broken(arr1, arr2) {
  arr1[0] = arr2[0];
  return arr1;
}

document.write("One: " + one + "<br>");
document.write("Two: " + two + "<br>");

document.write("Run 'broken': " + broken(one, two) + "<br>");

document.write("One: " + one + "<br>");
document.write("Two: " + two + "<br>");

, который производит этот вывод:

> One: 1
> Two: 2
> Run 'broken': 2
> One: 2    //<------- this line
> Two: 2

Как видите, значение массива 'one' было изменено по ссылке . Что я тут недопонимаю? Спасибо.

Ответы [ 2 ]

3 голосов
/ 12 февраля 2020

Поведение нарушенной функции правильное.

Как и в случае свойств объекта, если вы измените значение массива (но не самого массива), оно изменит оригинал.

Допустим, у нас есть массив

letters = ['A','C']

function willNotModify(array) { 
  array = ['A','Z']
}

function willModify(array) {
  array[1] = 'B'
}

willNotModify(letters) // letters array is unchanged 
willModify(letters)    // letters array is now ["A", "B"]

Надеюсь, это прояснит ваше понимание.

0 голосов
/ 12 февраля 2020

в сломанной функции ваши параметры являются ссылками на массивы, и вы передаете два значения переменных

Таким образом, компилятор путается с типами

...