什么是不可改变的意思?

ale*_*lex 103 javascript variables immutability

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

var str = 'foo';

alert(str.substr(1)); // oo

alert(str); // foo
Run Code Online (Sandbox Code Playgroud)

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

如果字符串是可变的,这是否意味着第二个alert()也会返回oo

kem*_*002 104

这意味着一旦实例化对象,就无法更改其属性.在你的第一个警报中,你不会改变foo.你正在创建一个新的字符串.这就是为什么在你的第二个警报中它将显示"foo"而不是oo.

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

是.创建字符串后,没有任何内容可以更改.现在,这并不意味着您无法为str变量分配新的字符串对象.您无法更改str引用的当前对象.

如果字符串是可变的,这是否意味着第二个alert()也会返回oo?

从技术上讲,不,因为substring方法返回一个新字符串.使对象变为可变,不会改变方法.使其变为可变意味着从技术上讲,您可以使子串会改变原始字符串而不是创建新字符串.


dec*_*eze 97

在较低级别,不变性意味着不会修改存储字符串的内存.创建字符串后"foo",将分配一些内存来存储该值"foo".这个记忆不会改变.如果使用,比如修改字符串,substr(1)则会创建一个新字符串,并分配将存储的不同内存部分"oo".现在你在内存中有两个字符串,"foo""oo".即使你"foo"不再使用它,它也会一直存在,直到收集垃圾为止.

字符串操作相对昂贵的一个原因.

  • 你好,从2015年开始!"在较低的层次上,不变性意味着字符串存储在其中的内存不会被修改." - 这是限制性太强,听起来不对.不变性只是关于用户空间,一旦保持语言规范不变量,虚拟内存可以随着内存分配器的喜好而改变. (3认同)
  • 这个答案比加入的答案更符合逻辑. (2认同)

Sof*_*eek 13

不可变是指无法改变或修改的.

因此,当您为字符串赋值时,此值是从头开始创建的,而不是替换.因此,每次为同一字符串分配新值时,都会创建一个副本.所以实际上,你永远不会改变原始价值.


Bri*_*n S 9

我不确定JavaScript,但在Java中,字符串使用"字符串常量池"进一步增加了不变性.字符串可以使用字符串文字("foo")或String类构造函数构造.使用字符串文字构造的字符串是字符串常量池的一部分,相同的字符串文字将始终与池中的内存地址相同.

例:

    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
Run Code Online (Sandbox Code Playgroud)

在上面,两个lit1lit2使用相同的字符串文字构造,因此它们指向相同的内存地址; lit1 == lit2结果true,因为它们是完全相同的对象.

但是,cons使用类构造函数构造.虽然参数是相同的字符串常量,构造分配用于新的存储器cons,意思cons是不相同的对象lit1lit2,尽管含有相同的数据.

当然,由于三个字符串都包含相同的字符数据,因此使用该equals方法将返回true.

(当然,两种类型的字符串结构都是不可变的)