Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Closed
KieSun opened this issue Apr 1, 2021 · 21 comments
Closed

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

KieSun opened this issue Apr 1, 2021 · 21 comments

Comments

@KieSun
Copy link
Owner

KieSun commented Apr 1, 2021

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

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

去答题

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

@turkyden
Copy link

turkyden commented Apr 1, 2021

JS 数据存储位置:

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

对象的拷贝:

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

@louwenqiang
Copy link

JS数据存储位置:

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

@teefing
Copy link

teefing commented Apr 1, 2021

JS数据存储位置:

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

@niices
Copy link

niices commented Apr 1, 2021

原始数据类型

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

引用数据类型

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

@Hazel-Lin
Copy link

JS数据存储位置:

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

@Chrisyjs
Copy link

Chrisyjs commented Apr 1, 2021

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

@hjwhuge
Copy link

hjwhuge commented Apr 1, 2021

JS数据存储位置

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

@makejun168
Copy link

JS中数据存放位置

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

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

答案

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

@l0ng09
Copy link

l0ng09 commented Apr 1, 2021

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

@qsnote
Copy link

qsnote commented Apr 1, 2021

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

@SunshineZJJ
Copy link

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

@AbigaiL533
Copy link

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

@muzishuiji
Copy link

JS中数据存放位置:

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

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

@ByeLe
Copy link

ByeLe commented Apr 1, 2021

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. 正是因为了引用类型的大小不可测,需要将其存储在空间可以自由分配的堆上。

@Leexuetao
Copy link

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

@dorothyLee56
Copy link

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

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

@docterlei
Copy link

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

@yiyu66
Copy link

yiyu66 commented Apr 1, 2021

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

@1742284240
Copy link

1742284240 commented Apr 1, 2021

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

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

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

@huangpingcode
Copy link

想知道上面的对吗?

@mengzhe510
Copy link

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

@KieSun KieSun closed this as completed Sep 16, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests