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"
不再使用它,它也会一直存在,直到收集垃圾为止.
字符串操作相对昂贵的一个原因.
Sof*_*eek 13
不可变是指无法改变或修改的.
因此,当您为字符串赋值时,此值是从头开始创建的,而不是替换.因此,每次为同一字符串分配新值时,都会创建一个副本.所以实际上,你永远不会改变原始价值.
我不确定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)
在上面,两个lit1
和lit2
使用相同的字符串文字构造,因此它们指向相同的内存地址; lit1 == lit2
结果true
,因为它们是完全相同的对象.
但是,cons
使用类构造函数构造.虽然参数是相同的字符串常量,构造分配用于新的存储器cons
,意思cons
是不相同的对象lit1
和lit2
,尽管含有相同的数据.
当然,由于三个字符串都包含相同的字符数据,因此使用该equals
方法将返回true.
(当然,两种类型的字符串结构都是不可变的)
归档时间: |
|
查看次数: |
36191 次 |
最近记录: |