javascript中不可变的值

Immutable values in javascript

本文关键字:不可变 javascript      更新时间:2023-09-26

我目前正在学习JavaScript,对不可变值真的很困惑。我所理解的是,当一个值被创建(刺痛/数字/布尔值)时,它永远不会被更改。

现在我的问题是,我赋予值的变量,这个变量的值是可变的。我可以给那个变量赋值。那么,为什么不变性很重要呢?

此外,当我为变量指定一个新值时,前一个值会发生什么?它会留在内存中并阻塞一些空间吗?它是否丢失了该变量的指针?到底发生了什么?

请帮助我理解JavaScript中"可变"answers"不可变"概念的实际用途。提前谢谢。

你对什么感到困惑

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

通常,当对一个对象的所有引用都丢失时,它们就会被垃圾收集,即为该对象分配的内存被释放,该对象将永远丢失。然而,这也与不可变对象和可变对象之间的区别无关。

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

不可变对象不会在适当的位置修改对象(即更改其外观)-它们会返回变量更改后的数据的新副本

Javascript中的可变对象不返回副本,但允许您更改对象本身。

我把它比作array.splice()array.slice()之间的区别。splice()将通过在需要的地方移除/插入元素来更改原始数组-slice()将创建一个只包含所需元素的新数组。可以让它们做同样的事情,但其中一个将数组变异,另一个创建副本。

一个不可变的对象在被更改时总是被迫返回一个新的副本——它本身不会被更改。可变对象可以,但不必在适当的位置进行突变。Javascript中的基元类型大多是不可变的-一旦创建,就不能更改字符串的形式(如果在JS字符串上调用replace,则会收到一个新字符串,其中包含您要求替换的值,而不是更改了值的同一字符串)。对象大多是可变的:例如,您可以执行object[key] = value并在引用对象的任何地方更改对象。

tl;dr

当您更改可变对象时,它在被引用的任何地方都会被更改。当你改变一个不可变的对象时,它根本不会改变——一个新的对象被创建,所有对该对象的旧引用都会给你原始对象,它没有任何不同。