如果我将数组传递给JS函数,它似乎不会修改该数组。它不应该通过引用传递吗?

时间:2018-11-07 21:02:24

标签: javascript arrays function reference

我类中的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 :(得分:1)

当您这样做:

citiesNames = [];
citiesPos = [];

变量不再是对传入的原始数组的引用,现在它们是对这两个空数组的引用。

如果要清除原始数组,只需设置它们的长度即可:

citiesNames.length = 0;
citiesPos.length = 0;

答案 1 :(得分:0)

在@Barmar的一个很好的答案上进行扩展-问题是数组和其他对象在Javascript中不是“真正通过引用传递”的,即使很多时候看起来也是如此,而且通常是这样描述的。像所有其他变量一样,它们按值传递-但是“值”本身是对存储在内存中的实际值的“引用”,而不是对另一个变量本身的引用。

因此,如果您要修改select person.emplid,addr.address_type,addr.address3 from person LEFT JOIN address addr on person.emplid=addr.emplid AND ( address_type IN ('HOME') OR address_type IS NULL) WHERE person.sex='female' ,例如在citiesNames上添加一个新元素,这将反映在函数外部-因为您将同时修改两个{ {1}}变量(局部变量和全局变量)是对它们的引用。

但是,当您执行push时,您正在使用citiesNames局部变量并将其重新分配为一个全新的值,而其他citiesNames=[]变量则无法知道

此行为并非Java语言独有。 Python的行为方式肯定与此相同(也许还有其他一些我不太熟悉的方式)。