Javascript 不可变意味着什么?
如果字符串是不可变的,这是否意味着。。。。 (让我们假设JavaScript) 这是否意味着,在对字符串调用方法时,它将返回修改后的字符串,但不会更改初始字符串Javascript 不可变意味着什么?,javascript,variables,immutability,Javascript,Variables,Immutability,如果字符串是不可变的,这是否意味着。。。。 (让我们假设JavaScript) 这是否意味着,在对字符串调用方法时,它将返回修改后的字符串,但不会更改初始字符串 如果字符串是可变的,这是否意味着第二个alert()也将返回oo?这意味着一旦实例化对象,就不能更改其属性。在第一个警报中,您没有更改foo。您正在创建一个新字符串。这就是为什么在第二个警报中会显示“foo”而不是oo 这是否意味着,当调用 一个字符串,它将返回修改后的 字符串,但它不会更改 初始字符串 对。创建字符串后,任何内容都无法
如果字符串是可变的,这是否意味着第二个
alert()
也将返回oo
?这意味着一旦实例化对象,就不能更改其属性。在第一个警报中,您没有更改foo。您正在创建一个新字符串。这就是为什么在第二个警报中会显示“foo”而不是oo
这是否意味着,当调用
一个字符串,它将返回修改后的
字符串,但它不会更改
初始字符串
对。创建字符串后,任何内容都无法更改它。现在,这并不意味着不能将新字符串对象分配给str
变量。您无法更改str引用的当前对象
如果字符串是可变的,那么
表示第二个警报()将返回oo
还有吗
从技术上讲,不是,因为substring方法返回一个新字符串。使对象可变不会改变方法。使其可变意味着从技术上讲,您可以使其使子字符串更改原始字符串,而不是创建新字符串。不可变意味着不能更改或修改
因此,当您为字符串赋值时,该值是从头创建的,而不是被替换。因此,每次为同一字符串指定新值时,都会创建一个副本。因此,实际上,您永远不会更改原始值。从字符串到堆栈。。。以下是一个简单易懂的示例: 像System.Collections.Generic.stack这样的可变堆栈 这显然是不合适的。我们想成为 能够采用现有路径并 从中为所有用户创建新路径 它的最后一个元素的邻居, 但是将一个新节点推到 标准堆栈修改堆栈。 我们必须复制这堆东西 在推它之前,这是愚蠢的 因为那样我们就可以复制所有的 不必要地破坏了它的内容 不可变堆栈没有这个问题。推上一个不变的 stack只创建一个全新的堆栈 哪个链接到旧的作为其 尾由于堆栈是不可变的, 没有其他代码的危险 走过来,弄乱尾巴 目录你可以继续使用 旧书堆让你心满意足 要深入理解不变性,请阅读Eric从以下内容开始的帖子:
在较低的级别上,不变性意味着存储字符串的内存不会被修改。创建字符串
“foo”
后,会分配一些内存来存储值“foo”
。这个记忆不会被改变。如果使用substr(1)修改字符串,则会创建一个新字符串,并分配另一部分内存来存储“oo”
。现在内存中有两个字符串,“foo”
和“oo”
。即使你不再使用“foo”
,它也会一直存在,直到被垃圾回收
字符串操作相对昂贵的一个原因。我不确定JavaScript,但在Java中,字符串通过“字符串常量池”向不变性迈出了额外的一步。可以使用字符串文本(
“foo”
)或字符串
类构造函数构造字符串。使用字符串文本构造的字符串是字符串常量池的一部分,相同的字符串文本将始终是池中的相同内存地址
例如:
String lit1 = "foo";
String lit2 = "foo";
String cons = new String("foo");
System.out.println(lit1 == lit2); // true
System.out.println(lit1 == cons); // false
System.out.println(lit1.equals(cons)); // true
在上面的例子中,lit1
和lit2
都是使用相同的字符串文本构造的,因此它们指向相同的内存地址lit1==lit2
导致true
,因为它们是完全相同的对象
但是,cons
是使用类构造函数构造的。尽管参数是相同的字符串常量,但构造函数为cons
分配新内存,这意味着cons
与lit1
和lit2
不是相同的对象,尽管包含相同的数据
当然,由于这三个字符串都包含相同的字符数据,因此使用equals
方法将返回true
(当然,两种类型的字符串构造都是不可变的)不可变意味着值不能更改。一旦创建了字符串对象,就不能将其修改为不可变的。如果您请求一个字符串的子字符串,将创建一个包含所请求部分的新字符串
在操作字符串时使用StringBuffer会使操作更加高效,因为StringBuffer将字符串存储在字符数组中,并使用变量保存字符数组的容量和数组的长度(字符数组形式的字符串)了解这个概念的一种方法是查看javascript如何处理所有对象,这是通过引用实现的。这意味着所有对象在实例化后都是可更改的,这意味着您可以添加具有新方法和属性的对象。这很重要,因为如果您希望对象是不可变的,那么对象在实例化后就不能更改。易变性的教科书定义可能会更改或更改。 在编程中,我们用这个词来表示其状态允许随时间变化的对象。一个不可变的值正好相反——在它被创建之后,它永远不会改变 如果这看起来很奇怪,请允许我提醒您,我们一直使用的许多值实际上是不可变的
var statement = "I am an immutable value";
var otherStr = statement.slice(8, 17);
我想没有人会惊讶地发现第二行并没有改变语句中的字符串。
事实上,没有任何字符串方法更改它们所操作的字符串,它们都返回新字符串。原因是字符串是不可变的——它们不能更改,我们只能创建新字符串
var statement = "I am an immutable value";
var otherStr = statement.slice(8, 17);
let string = "name";
string[0] = "N";
console.log(string); // name not Name
string = "Name";
console.log(string); // Name