JavaScript无法传递对“u”和“v”变量本身的引用。因此,在您的“swap()”函数中,对“x”或“y”的任何赋值都不会改变分配给“u”或“v”的内容。JavaScript传递到“u”和“v”保存的对象的引用。因此,您无法从“swap()”内更改“u”和“v”变量。您可以更改它们指向的对象的内容,因此可以修改“u”和“v”指向的对象的属性。
由于我具有C/C++背景,因此我认为在将对象传递为参数时,JavaScript所做的类似于“按指针传递”。当您调用“swap(u,v)”时,传递给“swap()”函数的是指向“u”也指向的数组的指针。因此,现在您有两个变量“u”和“x”,都“指向”同一数组。因此,如果您修改实际数组,则由于“u”指向该相同数组,两者都将看到修改。但是,“swap()”函数内部无论做什么都不能改变对象“u”或“v”实际指向的内容。
在JavaScript中,更改原始变量指向的对象的唯一方法是将它们作为对象的属性,并像这样传递对象:
function swap(obj, x, y) {
var temp = obj[x]; obj[x] = obj[y]; obj[y] = temp;
}
var container = {};
container.u = [1, 0];
container.v = [0, 1];
swap(container, "u", "v");
console.log(container.u);
console.log(container.v);
如果您不介意从头重新编写两个数组,您可以将一个数组的所有内容复制到一个临时数组中,然后将一个数组覆盖到另一个数组上,最后将临时数组的内容复制回第一个原始数组。这种方法并不是很高效,而且可能有更好的方法来解决您的原始问题,但是它是可行的。
function swap(x, y) {
var temp = x.splice(0, x.length);
x.push.apply(x, y);
y.length = 0;
y.push.apply(y, temp);
}