在学习js中 常常这样写代码

var a = "hello world"
a = "hello kitty"

然后 感觉字符串不是变了吗 为啥说字符串不可变呢

网上有一些说法 说 js中如果这样写(重新赋值) 就会把这个字符串当成对象去理解 a存的是字符串的内存地址 指向这个字符串 当重新赋值的时候 原本的堆里面的字符串没有消失 而是重新生成了一个新的字符串 被a接收 原本的字符串还保存在内存中 实际上这个思路我觉得是完全错误的
字符串本来就是简单数据类型 存在栈内存里面的 何来内存地址被引用呢

实际上字符串本身是一种经过由语言封装后的基础类型(通过系统自带的String构造函数new出来的),底层还是一个对象。而且由于字符串长度不可预知,不可能预留出足够的内存空间来支持可变长度。从 List 的角度来理解,List 本身也是初始化一个长度,持续往里面去添加对象,空间不够时再重新开辟一个更大的 List,再把旧的数据复制过来,本文的案例只是把字符串替换了,而不是去改变,旧的数据仍然存在内存中。

Last modification:May 14, 2021
If you think my article is useful to you, please feel free to appreciate