基本数据类型一定存在栈内存?一起来看看!

前言

平时大家都说基本数据类型存在栈内存,引用数据类型存在堆内存,这个说法完全对么?我们一起来看看吧。

因为栈内存是由浏览器引擎直接操作分配的,所以我们不能直观的去观察到栈内存的变化。但是我们可以通过浏览器控制台的memory观察堆内存的变化来曲线救国。

下面是测试代码

csharp 复制代码
  // 对象
  const obj = {
    a: 1,
    b:'b',
    c: 1.1
  }
  // 整数
  const int = 100
  // 浮点数
  const intFloat = 100.0
  const float = 100.1
  // 八进制
  const octalNumber = 0o144
  // 十六进制
  const hexNumber = 0x64
  // 科学计数法
  const scientificNumber = 1e2
  // 字符串,这里会不断声明全局变量来赋值,方便我们观察
  s0 = 's'
  for (let index = 1; index <= 50; index++) {
      window['s' + index] =   window['s' + (index-1)] + 's'
  }

null、undefined、boolean这几个类型存在栈中,没有争议,所以我们不做测试。

对象是引用数据类型,存放在堆内存中是没有争议的

浮点数和整数在堆内存中存储有一点区别的,他们的类型是不太一样的,一个是smi number,一个是heap number。这应该是浏览器针对number类型做优化所用到的,这里不做深入(有了解的大佬可以科普下)。

Number类型

可以看到只有浮点数100.1可以找到,而且100.0也没有找到,所以浏览器会试图将浮点数转为整数来存储。转换成功则直接存在栈里,转换失败则存放在堆内存中。

关于浮点数为何存储在堆内存中的猜测:

浮点数一般具有较高精度,并且浮点数运算需要更加复杂的数据结构和算法。所以不管是存储还是运算都会占用较多内存空间,所以浏览器默认会将浮点数存放在堆内存中方便处理,并节省栈内存空间(该猜测是结合chatGPT3.5的回答总结)。

String类型

可以看到从第12次拼接开始,所有变量的值都会存在堆内存中。还可以看到每个值都有first和second属性,分别是指向拼接用到的两个字符串的地址。并且运算用的值都是已存在的值,将结果存在新的内存空间(@82781、@17385这些便是值存在内存中的地址)。

关于部分字符串为何存储在堆内存中的猜测:

长字符串会放在堆内存中,具体阈值跟浏览器内存管理策略、引擎优化有关。

结论

所以我们都在堆内存找到了这些数字或者字符串,你还认为它存在栈内存中嘛?

相关推荐
|晴 天|3 小时前
Vue 3 + TypeScript + Element Plus 博客系统开发总结与思考
前端·vue.js·typescript
猫3283 小时前
v-cloak
前端·javascript·vue.js
AC赳赳老秦3 小时前
OpenClaw二次开发实战:编写专属办公自动化技能,适配个性化需求
linux·javascript·人工智能·python·django·测试用例·openclaw
旷世奇才李先生3 小时前
Vue 3\+Vite\+Pinia实战:企业级前端项目架构设计
前端·javascript·vue.js
Ulyanov4 小时前
《PySide6 GUI开发指南:QML核心与实践》 第二篇:QML语法精要——构建声明式UI的基础
java·开发语言·javascript·python·ui·gui·雷达电子对抗系统仿真
聚美智数5 小时前
企业实际控制人查询-公司实控人查询
android·java·javascript
SoaringHeart5 小时前
Flutter进阶:用OverlayEntry 实现所有弹窗效果
前端·flutter
IT_陈寒7 小时前
Vite静态资源加载把我坑惨了
前端·人工智能·后端
herinspace7 小时前
管家婆实用贴-如何分离和附加数据库
开发语言·前端·javascript·数据库·语音识别
小码哥_常7 小时前
从MVC到MVI:一文吃透架构模式进化史
前端