Если я передаю массив в функцию JS, он, похоже, не модифицирует этот массив. Разве это не должно быть передано по ссылке? - PullRequest
0 голосов
/ 08 ноября 2018

Эта функция Javascript внутри моего класса, похоже, не изменяет массив, который передается ей по ссылке:

this.filterEqualCities(this.birthCitiesNames, this.birthCitiesPositions);

  filterEqualCities: function(citiesNames, citiesPos) {
    var tempNamesArray = [];
    var tempPosArray = [];
    for(var i=0; i<citiesNames.length; i++) {
      var name = citiesNames[i];
      name = name.split(',')[0];
      if(tempNamesArray.indexOf(name) == -1) {
        tempNamesArray.push(name);
        tempPosArray.push(citiesPos[i]);
      }
    }
    citiesNames = [];
    citiesPos = [];
    for(var i=0; i<tempNamesArray.length; i++) {
      citiesNames.push(tempNamesArray[i]);
      citiesPos.push(tempPosArray[i]);
    }
  }

Ответы [ 2 ]

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

Чтобы немного расширить превосходный ответ @ Barmar - проблема в том, что массивы и другие объекты не на самом деле"передаются по ссылке" в Javascript, даже если кажется, что в большинстве случаев это так, и это часто так описывают. Они передаются по значению, как и все другие переменные, но само это «значение» является «ссылкой» на фактическое значение, хранящееся в памяти, а не на другую переменную.

Так что, если бы вы изменили citiesNames, скажем, push, добавив на него новый элемент, это отразилось бы вне функции - потому что вы изменили бы это общее значение, к которому относятся обе переменные citiesNames ( локальные и глобальные) являются ссылками на.

Но когда вы делаете citiesNames=[], вы берете локальную переменную citiesNames и переназначаете ее на совершенно новое значение, и ваша другая переменная citiesNames никак не может узнать об этом.

Это поведение не является уникальным для Javascript. Python, безусловно, ведет себя так же (и, возможно, другие тоже, с которыми я не так хорошо знаком).

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

Когда вы делаете:

citiesNames = [];
citiesPos = [];

переменные больше не являются ссылками на оригинальные переданные массивы, теперь они являются ссылками на эти два пустых массива.

Если вы хотите очистить исходные массивы, вы можете просто установить их длину:

citiesNames.length = 0;
citiesPos.length = 0;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...