【发布时间】:2016-03-18 23:11:42
【问题描述】:
您将如何恰当地解释这两个示例为何不同?
// Reassignment
let a = 1;
let b = a;
a = 2;
console.log(b); // → 1
// Mutation
let myArray = [1, 2, 3];
let ourArray = myArray;
ourArray[2] = 10;
console.log(myArray); // → [1, 2, 10]
关于为什么变量标签在两者之间的行为不同,许多资源声称这是因为引用类型和值类型之间的差异。但是,这不只适用于 values 本身之间的差异吗?
当明确谈论变量标签时(即为什么第一个示例中的标签不跟踪值的更改,而在第二个示例中却跟踪),真正的区别与 无关突变与重新分配?
毕竟,我们可以很容易地重新分配 myArray 或 ourArray 并且它们都不会有任何类型的持续链接。而且,如果 JavaScript 中的原始值在理论上是可变的,那么第一个示例的行为就可以与第二个示例一样。
后续问题
我还阅读了关于原始值是否仅在内存中存在一次的相互矛盾的信息。例如,如果第一个在内存中只存在一次,那么将变量标签可视化为名称标签是合适的,每个引用第一个的名称标签都“卡”在同一个数字上,对吗?
同样,如果第一号能够发生变异,那么每个名称标签都会跟踪该第一号的相同变化。但由于一个是不可变的,名称标签可以继续引用相同的数字 1,也可以将它们取下并粘贴到不同的值(重新分配)。
我在正确的轨道上吗?
【问题讨论】:
-
我认为您错过了使用低级语言(带指针)的体验。 5天的pascal苦苦挣扎,可以省去你50天的js苦苦挣扎,一切都会清晰得多。
-
是的,这是一个关于可变值与不可变值的突变与重新分配的问题。是否一次只有一个 9 的实例存在于内存中?可能,假设它是实际值,而不是您分配其他属性的
Numberobject,但这完全取决于编译器如何处理它。
标签: javascript variables reference immutability key-value