我很难理解变量的交换。有许多有用的线程解释了如何实际做到这一点,但我很难理解它。我正在谈论的示例是:
var a = 1;
b = 2;
c = a;
a = b;
b = c;
在我(非常基本的)理解中,我用简单的英语读到:每个声明的变量c包含变量a指向的任何内容。由于我们在声明之后分配了 a = b,下一个分配不应该使b保持值 2 (因为c指向我们刚刚分配给b的a)吗?
我很难理解变量的交换。有许多有用的线程解释了如何实际做到这一点,但我很难理解它。我正在谈论的示例是:
var a = 1;
b = 2;
c = a;
a = b;
b = c;
在我(非常基本的)理解中,我用简单的英语读到:每个声明的变量c包含变量a指向的任何内容。由于我们在声明之后分配了 a = b,下一个分配不应该使b保持值 2 (因为c指向我们刚刚分配给b的a)吗?
JavaScript 是按值调用/赋值(更具体地说,通过共享调用/赋值)即当您将一个变量分配给另一个变量时,该变量的值被复制。为变量分配新值永远不会更改另一个变量的值。它们之间没有隐含的联系。
更直观一点:假设b
保持值v
,那么在 之后a = b
,我们有
b -> v
a -> v
你似乎认为我们有a -> b -> v
,但事实并非如此。
在您的示例中:
c = a; // c now holds the value 1
a = b; // a now holds the value 2
b = c; // b now holds the value 1
不,在 JavaScript 中,将一个变量的值分配给另一个变量会分配该值的副本。因此之后
c = a;
变量“c”具有“a”中值的副本。随后将变量“b”的值的副本分配给“a”对“c”的值没有影响。
赋值运算符将右侧的值复制到左侧的变量中。它不会创建对变量的引用。
当语句c = a
运行时, 的值a
仍然是1
,因此 的值c
变为1
。
您不会更改c
代码中其他任何地方的值,因此当您达到 时b = c
,该值仍然是1
。