javascript中不可变的值
Immutable values in javascript
我目前正在学习JavaScript,对不可变值真的很困惑。我所理解的是,当一个值被创建(刺痛/数字/布尔值)时,它永远不会被更改。
现在我的问题是,我赋予值的变量,这个变量的值是可变的。我可以给那个变量赋值。那么,为什么不变性很重要呢?
此外,当我为变量指定一个新值时,前一个值会发生什么?它会留在内存中并阻塞一些空间吗?它是否丢失了该变量的指针?到底发生了什么?
请帮助我理解JavaScript中"可变"answers"不可变"概念的实际用途。提前谢谢。
你对什么感到困惑
变量的赋值与不可变或可变对象无关。变量只是一个别名:它引用内存中的对象。当您更改变量的值时,您所做的就是告诉编译器停止将该对象与该变量关联,而是将其与另一个对象关联。赋值不会影响底层对象-对象永远不会更改,您只是不再有访问它的方法。
通常,当对一个对象的所有引用都丢失时,它们就会被垃圾收集,即为该对象分配的内存被释放,该对象将永远丢失。然而,这也与不可变对象和可变对象之间的区别无关。
不可变对象和可变对象之间的真正区别
不可变对象不会在适当的位置修改对象(即更改其外观)-它们会返回变量更改后的数据的新副本。
Javascript中的可变对象不返回副本,但允许您更改对象本身。
我把它比作array.splice()
和array.slice()
之间的区别。splice()
将通过在需要的地方移除/插入元素来更改原始数组-slice()
将创建一个只包含所需元素的新数组。可以让它们做同样的事情,但其中一个将数组变异,另一个创建副本。
一个不可变的对象在被更改时总是被迫返回一个新的副本——它本身不会被更改。可变对象可以,但不必在适当的位置进行突变。Javascript中的基元类型大多是不可变的-一旦创建,就不能更改字符串的形式(如果在JS字符串上调用replace
,则会收到一个新字符串,其中包含您要求替换的值,而不是更改了值的同一字符串)。对象大多是可变的:例如,您可以执行object[key] = value
并在引用对象的任何地方更改对象。
tl;dr
当您更改可变对象时,它在被引用的任何地方都会被更改。当你改变一个不可变的对象时,它根本不会改变——一个新的对象被创建,所有对该对象的旧引用都会给你原始对象,它没有任何不同。
- JavaScript Array unshift() 以一种不可变的方式
- javascript中不可变的值
- Undersatnding JavaScript 不可变变量和垃圾收集器
- JavaScript 中的数字是不可变的吗?
- 如何在 React/Javascript 中的不可变树中存储指向嵌套节点的“指针”
- 如何使用不可变的 JavaScript 模拟状态
- javascript:File 对象是不可变的
- 涉及不可变属性的Javascript缩小逻辑
- 文本输入不会变成可变javascript
- 在现代javascript中实现enum作为不可变类(es2015)
- 如何在Javascript中使用共享的、不可变的引用类型来跟踪更改
- 对象包装在JavaScript中是不可变的
- 我们可以在Javascript中修改不可变对象的方法吗?
- 具有直接属性访问的不可变javascript
- Javascript数字-不可变
- javascript中的不可变类型
- 理解Javascript不可变变量
- 雄辩JavaScript:不可变的字符串值
- 如何在JavaScript不可变对象的函数转换中处理if/else以便调试
- 如何在JavaScript中创建一个高性能、不可变的数组