第十九题:JS 中的数据存放位置
KieSun opened this issue · comments
JS 数据存储位置:
- 原始类型:栈存储
- 引用类型:指针为栈存储,值为堆存储
对象的拷贝:
- 浅拷贝:复制指针即引用关系
- 深拷贝:复制存储在堆中的数值,绝对隔离
JS数据存储位置:
- 原始类型:栈
- 引用类型:
- 引用类型的指针在栈
- 引用类型的值在堆
JS数据存储位置:
- 原始类型:栈
- 引用类型
- 指针存放在栈中
- 内容存放在堆中
- 涉及闭包
- 与闭包相关的变量值(不管是原始类型还是引用类型的指针),存放在堆中
- 闭包的指针存放在栈中
原始数据类型
undefined、Boolean、Number、String、BigInt、Symbol
储存位置:栈
传值方式:按值传递
原始数据类型复制时,系统会为新的变量在栈中创建一块新的内存区域存放复制的值
引用数据类型
null、Object、Function
储存位置:数据储存在堆中,栈中只会储存指向堆的一个指针地址
传值方式:按引用传递
引用数据类型复制时,系统只会在栈中复制同一个指针地址,多个变量其实指向的是同一个指针地址
特别的,null代表一个空对象指针
JS数据存储位置:
原始类型:栈
引用类型:堆
引用类型在栈中存储指针,在堆中存储具体的对象
原始类型:栈
引用类型:指针地址存在栈中,内容存在堆中
JS数据存储位置
- 原始数据
- 存放在栈中
- 引用数据
- 栈中存放的是引用数据在堆中的地址
- 引用数据的值存放在堆中
JS中数据存放位置
原始类型存在哪里?对象又存在哪里
- 原始类型
- String
- Boolean
- Number
- undefined
- BigInt
- Symbol
- 引用类型
- Object
- Null
- Function
答案
原始类型存放在栈里,
引用类型在栈中存储指针,在堆中存储具体的对象
不管是堆和还是栈,都是存储在物理内存里,只是各自的表现形式不同,原始数据是直接获取,对象是间接获取
js是弱类型脚本语言,解释执行,执行时会根据变量类型重新分配内存空间,执行后会释放空间,赋值再重新开辟内存
栈空间会存放原始类型,
堆空间会存放引用类型。
对于引用类型,指针是存放在栈中的,指针指向的对象存放在堆中
JS中数据存放位置:
- 原始类型
- String
- Boolean
- Number
- undefined
- BigInt
- Symbol
- Null
- 引用类型
- Object
- Array
- Function
答案
原始类型存放在栈里,
引用类型在堆中存储具体的对象,在栈中存储指针(存放堆中对象的地址)
JS的数据类型分为两大类,他分为基本数据类型
,与引用数据类型
。
- 基本数据类型有: String, Boolean, Number, null, undefined。
- 引用数据类型: Object, Array, Function, Date, RegExp等。
基本数据类型以及引用数据类型的地址都存在栈上,引用数据类型都存在堆上。
为啥基本数据类型要存在栈上,引用数据类型都存在堆上,堆和栈有啥区别?
-
栈是程序在编译运行的时候,系统就已经分配好了一定的空间给程序执行
,而堆不同,堆的大小是动态的,在通过构造函数生成一个对象的时候,这个时候就需要向系统申请一块地方,在执行完毕之后根据语言的不同,C语言需要程序员自己释放内存。Java,JavaScript等语言会自动进行垃圾回收,从而进行空间的释放
。程序在申请空间和释放空间时候的性能比较底下,所以堆相比于编译运行时已经确定好的空间相比,性能会有所下降。 -
栈上的存取速度非常快,仅次于寄存器,既然栈上的存取速度很快,为啥引用类型还要存在堆上?首先当你生成一个对象的时候,这个对象可能是无限大的,那么当这个对象的大小超过栈的话(第二点说明了,栈内存是编译运行的时候已经确定了),就会出现栈溢出导致程序崩溃。那基础类型不会吗?基础类型的大小都是确定的,都会有一个最大值。例如字JS中的数字,
Number 类型都是浮点类型并且存储空间为 8 数节(byte)(8*8 bit位)。其中Number 类型值的整数最多15位,小数最多17位。
-
正是因为了引用类型的大小不可测,需要将其存储在空间可以自由分配的堆上。
1、基本数据类型,存储在栈中
2、引用类型:指针存储在栈中,值存储在堆中
js内存分为:栈和堆
栈的特点:大小固定、顺序存储、先进后出
堆的特点:大小动态变化、随机存储
js将数据分为基础类型和引用类型:
基本数据类型的值大小固定,直接存储在栈中,和栈的特点大小固定
引用类型数据:值存在堆中,易于扩展。值的地址存放在栈中。
1.基本数据类型 存储这栈中
2.引用数据类型 存储栈堆中
3. 全局变量 因为绑定中window上 所以存在堆中 闭包中的变量 会存在堆中 因为闭包中的变量作为作为ao(Activity object)存栈函数的作用链中
原始类型:栈
引用数据类型:指针存储在栈中,值存储在堆中。
堆中不存放基本类型和对象引用,只存放对象本身。
js存放数据的内存分为三种:
- 静态内存
- 栈内存
- 堆内存
- 全局变量的 基本数据类型 和 引用数据的引用地址 存放在静态内存中,引用数据还是存在堆中;
- 栈指的是函数调用栈,函数执行时会创建执行上下文栈,变量对象VO变为活动对象AO,活动对象中的 基本数据类型和引用数据类型的地址 存储在栈内存中,函数执行完毕,对应的栈内存被实时销毁,内存空间自动回收;
- 堆内存(动态内存)中存储的是全局引用变量数据和动态分配的对象,即活动对象AO的引用数据是存在堆内存的,堆内存中的内存空间需要等垃圾回收机制(gc)回收。
参考资料:关于JS中内存管理,变量分配的三种方式
想知道上面的对吗?
JS数据存储位置:
全局变量:静态区
原始类型:栈
引用类型
指针存放在栈中
值存放在堆中