KieSun / all-of-frontend

你想知道的前端内容都在这

Home Page:https://yuchengkai.cn/docs/frontend

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

第十九题:JS 中的数据存放位置

KieSun opened this issue · comments

commented

大家都知道数据会存放在堆栈中。那么到底原始类型存在哪里?对象又存在哪里?

网上的大部分关于这部分的解释都是错误的

去答题

新建了一个大厂真题每日打卡群,有意愿学习打卡的再进,请备注打卡

JS 数据存储位置:

  • 原始类型:栈存储
  • 引用类型:指针为栈存储,值为堆存储

对象的拷贝:

  • 浅拷贝:复制指针即引用关系
  • 深拷贝:复制存储在堆中的数值,绝对隔离

JS数据存储位置:

  • 原始类型:栈
  • 引用类型:
  1. 引用类型的指针在栈
  2. 引用类型的值在堆

JS数据存储位置:

  • 原始类型:栈
  • 引用类型
    • 指针存放在栈中
    • 内容存放在堆中
  • 涉及闭包
    • 与闭包相关的变量值(不管是原始类型还是引用类型的指针),存放在堆中
    • 闭包的指针存放在栈中

原始数据类型

undefined、Boolean、Number、String、BigInt、Symbol
储存位置:栈
传值方式:按值传递
原始数据类型复制时,系统会为新的变量在栈中创建一块新的内存区域存放复制的值

引用数据类型

null、Object、Function
储存位置:数据储存在堆中,栈中只会储存指向堆的一个指针地址
传值方式:按引用传递
引用数据类型复制时,系统只会在栈中复制同一个指针地址,多个变量其实指向的是同一个指针地址
特别的,null代表一个空对象指针

commented

JS数据存储位置:

原始类型:栈
引用类型:堆
引用类型在栈中存储指针,在堆中存储具体的对象

原始类型:栈
引用类型:指针地址存在栈中,内容存在堆中

JS数据存储位置

  • 原始数据
    • 存放在栈中
  • 引用数据
    • 栈中存放的是引用数据在堆中的地址
    • 引用数据的值存放在堆中

JS中数据存放位置

原始类型存在哪里?对象又存在哪里

  1. 原始类型
  • String
  • Boolean
  • Number
  • undefined
  • BigInt
  • Symbol
  1. 引用类型
  • Object
  • Null
  • Function

答案

原始类型存放在里,
引用类型在栈中存储指针,在堆中存储具体的对象

不管是堆和还是栈,都是存储在物理内存里,只是各自的表现形式不同,原始数据是直接获取,对象是间接获取

js是弱类型脚本语言,解释执行,执行时会根据变量类型重新分配内存空间,执行后会释放空间,赋值再重新开辟内存

image
JavaScript引擎的内存空间主要分为栈和堆。原始类型,变量,变量赋值存在栈里,如果变量是对象,变量和声明和值分别存在堆里,值是个指向堆的地址码;引用类型(对象)将在内存中的存储位置转为十六进制的url引用地址存在堆里;

栈空间会存放原始类型,
堆空间会存放引用类型。
对于引用类型,指针是存放在栈中的,指针指向的对象存放在堆中

JS中数据存放位置:

  1. 原始类型
  • String
  • Boolean
  • Number
  • undefined
  • BigInt
  • Symbol
  • Null
  1. 引用类型
  • Object
  • Array
  • Function

答案
原始类型存放在栈里,
引用类型在堆中存储具体的对象,在栈中存储指针(存放堆中对象的地址)

commented

JS的数据类型分为两大类,他分为基本数据类型,与引用数据类型

  1. 基本数据类型有: String, Boolean, Number, null, undefined。
  2. 引用数据类型: Object, Array, Function, Date, RegExp等。

基本数据类型以及引用数据类型的地址都存在栈上,引用数据类型都存在堆上。
为啥基本数据类型要存在栈上,引用数据类型都存在堆上,堆和栈有啥区别?

  1. 栈是程序在编译运行的时候,系统就已经分配好了一定的空间给程序执行,而堆不同,堆的大小是动态的,在通过构造函数生成一个对象的时候,这个时候就需要向系统申请一块地方,在执行完毕之后根据语言的不同,C语言需要程序员自己释放内存。Java,JavaScript等语言会自动进行垃圾回收,从而进行空间的释放。程序在申请空间和释放空间时候的性能比较底下,所以堆相比于编译运行时已经确定好的空间相比,性能会有所下降。

  2. 栈上的存取速度非常快,仅次于寄存器,既然栈上的存取速度很快,为啥引用类型还要存在堆上?首先当你生成一个对象的时候,这个对象可能是无限大的,那么当这个对象的大小超过栈的话(第二点说明了,栈内存是编译运行的时候已经确定了),就会出现栈溢出导致程序崩溃。那基础类型不会吗?基础类型的大小都是确定的,都会有一个最大值。例如字JS中的数字,Number 类型都是浮点类型并且存储空间为 8 数节(byte)(8*8 bit位)。其中Number 类型值的整数最多15位,小数最多17位。

  3. 正是因为了引用类型的大小不可测,需要将其存储在空间可以自由分配的堆上。

1、基本数据类型,存储在栈中
2、引用类型:指针存储在栈中,值存储在堆中

commented

js内存分为:栈和堆
栈的特点:大小固定、顺序存储、先进后出
堆的特点:大小动态变化、随机存储

js将数据分为基础类型和引用类型:
基本数据类型的值大小固定,直接存储在栈中,和栈的特点大小固定
引用类型数据:值存在堆中,易于扩展。值的地址存放在栈中。

commented

1.基本数据类型 存储这栈中
2.引用数据类型 存储栈堆中
3. 全局变量 因为绑定中window上 所以存在堆中 闭包中的变量 会存在堆中 因为闭包中的变量作为作为ao(Activity object)存栈函数的作用链中

原始类型:栈
引用数据类型:指针存储在栈中,值存储在堆中。
堆中不存放基本类型和对象引用,只存放对象本身。

js存放数据的内存分为三种:

  • 静态内存
  • 栈内存
  • 堆内存
  1. 全局变量的 基本数据类型引用数据的引用地址 存放在静态内存中,引用数据还是存在堆中
  2. 栈指的是函数调用栈,函数执行时会创建执行上下文栈,变量对象VO变为活动对象AO,活动对象中的 基本数据类型和引用数据类型的地址 存储在栈内存中,函数执行完毕,对应的栈内存被实时销毁,内存空间自动回收;
  3. 堆内存(动态内存)中存储的是全局引用变量数据和动态分配的对象,即活动对象AO的引用数据是存在堆内存的,堆内存中的内存空间需要等垃圾回收机制(gc)回收。

参考资料:关于JS中内存管理,变量分配的三种方式

想知道上面的对吗?

JS数据存储位置:
全局变量:静态区
原始类型:栈
引用类型
指针存放在栈中
值存放在堆中