大家好,我是林三心,用最通俗易懂的话讲最难的知识点是我的座右铭,基础是进阶的前提是我的初心。
在我们的认知里:基础类型存栈内存,引用数据类型存堆内存。
const a = '林三心'const b = { age: 18, height: 180}
图片
大家都知道,字符串属于基础类型,所以大家会觉得字符串是存在栈内存中的,但是大家要知道,V8默认栈内存是984Kib,那如果一个超长字符串 > 984Kib能装的进栈内存吗?这也就是一个比较经典的问题——大象装箱问题,试问:一头大象能装进一个小箱子里吗?
图片
先来看一段代码
const func = function() { this.str1 = '林三心' this.str2 = 'Sunshine_Lin'}const a = new func()const b = new func()
然后咱们来看看堆快照的详情
图片
上面的结果可以看出:
那我们可不可以猜测出一个结论:字符串的内容存于堆内存中,指针存于栈内存中,且相同的字符串指向同一个堆内存地址
我们稍微修改下代码
const func = function() { this.str1 = '林三心' this.str2 = 'Sunshine_Lin'}const a = new func()const b = new func()// 修改str1a.str1 = '哈哈哈哈哈哈哈哈哈哈'// 新增str3,跟str2一样a.str3 = 'Sunshine_Lin'
再来看看现阶段的堆快照的详情
图片
上面的结果可以看出:
那我们可不可以猜测出一个结论:新增或者修改字符串后,如果是一个之前不存在的字符串,则新开辟内存空间,如果是已有的,则直接使用已有的内存空间
当我们声明一个字符串时:
图片
图片
图片
字符串的数据存于 堆内存 中,栈内存 中只是存其 地址指针
当我们新建一个字符串时,V8会从内存中查找一下是否已经有存在的一样的字符串,找到的话直接复用。如果找不到的话,则开辟一块新的内存空间来存这个字符串,并把地址赋给变量。
大家有没有想过,为什么字符串不能通过下标索引来进行修改呢?因为字符串的修改本质上只能是通过整个的修改,而不能局部修改。
本文链接:http://www.28at.com/showinfo-26-79841-0.html「字符串」存在「栈内存」?那我可要杠你了哦!
声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com
上一篇: ZGC可伸缩低延迟垃圾收集器深度解析