前端 js 栈内存和堆内存 基本数据类型和复杂数据类型的区别?

简介: 前端 js 栈内存和堆内存 基本数据类型和复杂数据类型的区别?

前端 js 栈内存和堆内存 基本数据类型和复杂数据类型的区别?

先了解一下JavaScript 数据类型有哪些?

javaScript 中有8种基本的数据类型:7种为基本数据类型,而Object 为复杂数据类型

基本数据类型(原始数据类型):

  • number 用于任何类型的数字
  • bigint 用于任意长度的整数。
  • string 用于字符串
  • boolean :布尔值 用于 true 和 false。
  • null 用于未知的值
  • undefined 用于未定义的值 —— 只有一个 undefined 值的独立类型。
  • symbol 用于唯一的标识符。

复杂数据类型(非原始数据类型):

亿点小知识: Object 是复杂数据类型的统称,以下类型都是属于Object 类型:

  • Function(函数)
  • Array(数组)
  • Date(日期)
  • RegExp(正则表达式)
接下来我们来看一下 栈内存和堆内存

当定义一个变量的时候,JavaScript 引擎会为变量分配两种内存:栈内存和堆内存。

栈内存和堆内存分别对应基本数据类型和复杂数据类型

  • 栈内存:

基本数据类型: number、bigint 、string 、boo lean 、null 、undefined 、symbol

对于基本数据类型有固定的大小。JavaScript 引擎为它们分配一片固定的内存,并存储在上:

let name = "小张";
let age = 18;

因为 name 和 age 都是基本数据类型,JavaScript 引擎将它们存储在栈上,如下图所示:

JavaScript 将对象复杂数据类型(Object) 存储在堆上

let obj = {
    name: "小张",
    age: 18
};
let arr = [1,2,3]

对于复杂数据类型 会把变量名(对象名)作为堆内存的地址指向 堆内存 如下图所示:

关于栈(Stack)

“栈”具有线程和“先进后出”的特点,也就是每个栈桢一般会保存下一个栈桢的地址,指向next节点(即指向下一个栈桢),类似队列的链式结构。同时先入栈的会先执行,后入栈的会先弹出(执行完销毁)。

我们常说的栈内存一般指的是内存的空间栈。

那么栈内存有哪些特点

数据一执行完毕,变量会立即释放,节约内存空间。

  • 优势:存取速度比堆要快,仅次于直接位于CPU中的寄存器。
  • 缺点:存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。
    亿点小知识:栈内存的数据会进行共享
let a = 2
let b = 2

运行过程是 它会在栈中创建一个变量为a的引用 然后查找栈内是否有2这个数据,如果没有就创建一个2数据进行赋值,当b进行查找的时候会找到2这个数据直接会指向2这个数据,但当a=3的时候 同样会去查找有没有3数据,没有会进行创建3,但不会影响b=2 这个值

关于堆(Heap)

是内存中最大的一块内存区域,也是被各个线程共享的内存区域,所有的对象实例(或复杂类型信息)都保存在堆内存中。

堆内存特点

堆内存中所有的实体都有内存地址值,内存释放靠垃圾回收机制不定时的收取。

  • 堆的优势:可以动态地分配内存大小。
  • 缺点:由于要在运行时动态分配内存,存取速度较慢。(这个一般是体会不到的,只是相对于栈内存而言)
了解一些相关的知识
  • 变量
    变量名是栈内存指针的别名。因为可以先声明变量,后赋值。
    声明变量是在指针页表里建立变量信息。而赋值才是真正的开辟内存空间。但是为了节省内存所以变量名与值数据是分开存放的。
  • 就因为变量与值是分开两个地方保存,所以才有“栈内存数据共享”这个特性。从而会有不同的变量名指向同一个内存,和相同变量名指向不同的内存等情况。

     而保存变量名的内存地址称为指针变量。

  • 内存溢出
    内存溢出是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory。
  • 内存泄露
  • 内存泄露是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。
    我们在开发中有时候会遇到浏览器崩溃无响应可能就是因为内存堆积的后果。

以上就是js的栈内存和堆内存感谢大家的阅读

如碰到其他的问题 可以私下我 一起探讨学习

如果对你有所帮助还请 点赞 收藏谢谢~!

关注收藏博客 作者会持续更新…

相关文章
|
前端开发 JavaScript 数据可视化
58K star!这个让网页动起来的JS库,前端工程师直呼真香!
Anime.js 是一款轻量级但功能强大的JavaScript动画引擎,它能够以最简单的方式为网页元素添加令人惊艳的动效。这个项目在GitHub上已经获得58,000+星标,被广泛应用于电商页面、数据可视化、游戏开发等场景。
734 8
|
JavaScript 前端开发
|
存储 JavaScript 前端开发
|
移动开发 JavaScript 前端开发
|
存储 JavaScript 前端开发
|
JavaScript 前端开发
|
JavaScript 前端开发 开发者
|
存储
阿里云轻量应用服务器收费标准价格表:200Mbps带宽、CPU内存及存储配置详解
阿里云香港轻量应用服务器,200Mbps带宽,免备案,支持多IP及国际线路,月租25元起,年付享8.5折优惠,适用于网站、应用等多种场景。
3447 0
|
存储 缓存 NoSQL
内存管理基础:数据结构的存储方式
数据结构在内存中的存储方式主要包括连续存储、链式存储、索引存储和散列存储。连续存储如数组,数据元素按顺序连续存放,访问速度快但扩展性差;链式存储如链表,通过指针连接分散的节点,便于插入删除但访问效率低;索引存储通过索引表提高查找效率,常用于数据库系统;散列存储如哈希表,通过哈希函数实现快速存取,但需处理冲突。不同场景下应根据访问模式、数据规模和操作频率选择合适的存储结构,甚至结合多种方式以达到最优性能。掌握这些存储机制是构建高效程序和理解高级数据结构的基础。
1158 1

热门文章

最新文章

  • 1
    前端如何存储数据:Cookie、LocalStorage 与 SessionStorage 全面解析
    1276
  • 2
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(九):强势分析Animation动画各类参数;从播放时间、播放方式、播放次数、播放方向、播放状态等多个方面,完全了解CSS3 Animation
    582
  • 3
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(八):学习transition过渡属性;本文学习property模拟、duration过渡时间指定、delay时间延迟 等多个参数
    444
  • 4
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(七):学习ransform属性;本文学习 rotate旋转、scale缩放、skew扭曲、tanslate移动、matrix矩阵 多个参数
    442
  • 5
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(六):全方面分析css的Flex布局,从纵、横两个坐标开始进行居中、两端等元素分布模式;刨析元素间隔、排序模式等
    560
  • 6
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(五):背景属性;float浮动和position定位;详细分析相对、绝对、固定三种定位方式;使用浮动并清除浮动副作用
    738
  • 7
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(四):元素盒子模型;详细分析边框属性、盒子外边距
    1442
  • 8
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(三):元素继承关系、层叠样式规则、字体属性、文本属性;针对字体和文本作样式修改
    319
  • 9
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(二):CSS伪类:UI伪类、结构化伪类;通过伪类获得子元素的第n个元素;创建一个伪元素展示在页面中;获得最后一个元素;处理聚焦元素的样式
    1174
  • 10
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(一):CSS发展史;CSS样式表的引入;CSS选择器使用,附带案例介绍
    515