我类中的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]);
}
}
答案 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的行为方式肯定与此相同(也许还有其他一些我不太熟悉的方式)。