在C中,声明并初始化原语后,我们可以访问存储原语的内存地址并直接修改其值。然而,在 JavaScript 中,原始值是不可变的。例如,一旦创建了字符串,就无法对其进行修改。
我的问题是,是什么阻止我们简单地访问存储值的内存位置并直接改变值?这只是惯例吗?
我在其他地方读到,当在 JavaScript 中为变量分配原始值时,变量指向代表被分配的原始值的预先确定的内存位置,而不是内存中保存指定值的任意位置。例如,如果我写:
let a = 3;
let b = 3;
a
和b
都应该指向表示值3的相同内存地址。因此,说JS解释为值3的内存地址现在保存值4是没有意义的。但是我我不确定我是否理解这个概念。如何有足够的内存位置来表示所有可能的原语?肯定是我误会了什么。
a 和 b 都应该指向表示值 3 的同一内存地址
这不是真的。
a
和b
都指向保存值3
的内存地址。这是否是同一个地址完全取决于 JavaScript 运行时。
如何有足够的内存位置来表示所有可能的原语?
“所有原始值”的内存没有预先分配。 JavaScript 根据需要分配内存。事实上,它可能会耗尽。考虑以下几点:
const arr = [];
for (let i = 0; i < SOME_HUGE_VALUE; ++i) {
arr.push(i);
}
此示例中的任何内容都不能被垃圾收集,因此 JavaScript 被迫不断向
arr
添加值。如果尺寸足够大,这确实会崩溃。