JavaScript中的不可变值

3
我目前正在学习JavaScript,并对不可变值感到困惑。我的理解是,当一个值被创建(字符串/数字/布尔值),它就永远不能改变。
现在我的问题是,我分配值的变量是可变的。我可以为该变量分配新值。那么为什么不变性很重要?
另外,当我为一个变量分配一个新值时,先前的值会发生什么?它会留在内存中并阻塞一些空间吗?它会失去与该变量的指针吗?实际上会发生什么?
请帮助我理解JavaScript中“可变”和“不可变”概念的实际用途。谢谢。

我认为这个问题类似于下面的链接<br>理解不可变变量 - Nadimul De Cj
也许这个q&a会有所帮助。 - user5536315
1个回答

8

你似乎对以下内容感到困惑

变量的赋值与不可变或可变对象无关。变量只是一个别名:它引用内存中的一个对象。当您更改变量的值时,您所做的只是告诉编译器停止将该对象与此变量相关联,并将其与另一个对象相关联。赋值不会影响底层对象-对象永远不会改变,您只是不再有访问它的方式。

通常,当所有对对象的引用都丢失时,它们会被垃圾回收,即为对象分配的内存被释放,并且对象永远丢失。但是,这也与不可变和可变对象之间的区别无关。

不可变对象和可变对象的真正区别

不可变对象不会在原地修改对象(即更改其外观)-它们返回数据的新副本,并更改变量。

Javascript中的可变对象不返回副本,但可以让您直接更改对象本身。

我将其类比于array.splice()array.slice()之间的区别。 splice()将通过删除/插入需要的元素来更改原始数组-slice()将创建一个仅包含所需元素的新数组。它们可以被制作成做相同的事情-但是一个会直接在原来的数组上进行更改,另一个则创建副本。

当更改不可变对象时,它强制始终返回新的副本-它本身不会更改。可变对象可以进行变异,但不必如此。 Javascript中的基本类型大多是不可变的-一旦创建字符串的形式就无法更改(如果在JS字符串上调用replace,则将得到一个新字符串,其中请求替换的值已更改,而不是具有更改值的相同字符串)。对象大多是可变的:例如,您可以执行object[key] = value并更改引用该对象的所有位置。

简而言之

当您更改可变对象时,它将在其被引用的每个地方都更改。当您更改不可变对象时,它根本不会更改-将创建一个新对象,并且所有旧对象的引用将为您提供原始对象,没有任何不同之处。


1
在这里,重新分配和变异的区别至关重要。变异:var s =“abc”; s [0] =“x”产生“abc”。重新分配:var s =“abc”; s =“xbc”产生“xbc”。如果Javascript中的字符串是可变的,则两个表达式都将产生“xbc” - user5536315
@IvenMarquardt 我认为你的意思是s[0] = "x"会得到"xbc" - Akshat Mahajan
2
s 是一个字符串,在 JavaScript 中是不可变的。这就是为什么修改失败并且产生了 "abc" 的原因。假设在 JavaScript 中字符串是可变的var s = "abc",t = s; s[0] = "x";。现在 s 将包含 "abx",而 t 将包含 "abc",因为 st 都是值类型,并且这些类型总是按值复制的。 - user5536315

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接