Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 不可变意味着什么?_Javascript_Variables_Immutability - Fatal编程技术网

Javascript 不可变意味着什么?

Javascript 不可变意味着什么?,javascript,variables,immutability,Javascript,Variables,Immutability,如果字符串是不可变的,这是否意味着。。。。 (让我们假设JavaScript) 这是否意味着,在对字符串调用方法时,它将返回修改后的字符串,但不会更改初始字符串 如果字符串是可变的,这是否意味着第二个alert()也将返回oo?这意味着一旦实例化对象,就不能更改其属性。在第一个警报中,您没有更改foo。您正在创建一个新字符串。这就是为什么在第二个警报中会显示“foo”而不是oo 这是否意味着,当调用 一个字符串,它将返回修改后的 字符串,但它不会更改 初始字符串 对。创建字符串后,任何内容都无法

如果字符串是不可变的,这是否意味着。。。。 (让我们假设JavaScript)

这是否意味着,在对字符串调用方法时,它将返回修改后的字符串,但不会更改初始字符串


如果字符串是可变的,这是否意味着第二个
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