3

我试图在 JavaScript 中交换两个变量,但我的代码不起作用。谁能告诉我为什么?

这应该返回 10, 5 我想,因为我已经调用了交换函数。但相反,它返回 5、10。

function swap(a, b) {
  var temp = a;
  a = b;
  b = temp
}

var x = 5;
var y = 10;
swap(x, y);
console.log(x, y);

4

4 回答 4

4

JavaScript 和 Java 一样,只能通过引用传递。这意味着虽然您的函数确实交换了值,但调用范围内的实际值xy没有被交换。这里的一种解决方法可能是返回一个值数组,交换:

function swap(a, b) {
    return [b, a];
}

var x = 5;
var y = 10;
[x, y] = swap(x, y);
console.log("x after swap = " + x);
console.log("y after swap = " + y);

请注意,这里的关键线是分配:

[x, y] = swap(x, y);

这会将 和 重新分配xy一行中的交换数组。

于 2020-10-18T02:52:54.253 回答
2

您可以使用解构赋值方法:

let a = 1;
let b = 2;

[a, b] = [b, a];

a; // => 2
b; // => 1
于 2020-10-18T02:56:14.047 回答
1

Javascript 函数值不是通过引用传递的,而是在 a、b 中复制值。所以改为返回值:

function swap(a, b) {
  return [b, a];
}

后来得到它:

[x, y] = swap(x, y);
于 2020-10-18T02:56:12.287 回答
1

您可以使用 JavaScript 的对象来实现这一点,这些对象通过共享传递,类似于您在其他语言中可能遇到的通过引用传递。这使您可以做一些原始值无法完成的事情 -

function ref (value) {
  return { value }
}

function deref (t) {
  return t.value
}

function set (t, value) {
  t.value = value
}

function swap (a, b) {
  const temp = deref(a)
  set(a, deref(b))
  set(b, temp)
}

const x = ref(3)
const y = ref(5)
swap(x,y)
console.log(deref(x), deref(y)) // 5 3

你可以用你选择的任何方式进行这种抽象——

const box = v => [v]
const unbox = t => t[0]
const set = (t, v) => t[0] = v

function swap (a, b) {
  const temp = unbox(a)
  set(a, unbox(b))
  set(b, temp)
}

const x = box(3)
const y = box(5)
swap(x,y)
console.log(unbox(x), unbox(y)) // 5 3

于 2020-10-18T03:03:31.787 回答