Js中的堆(heap)和栈(stack)内存

news2024/11/20 16:35:28

目录

  • 1、堆和栈的概念
  • 2、数据类型
  • 3、腾讯面试题
  • 4、阿里面试题

1、堆和栈的概念

  • 在JS钟变量都存放在内存中,而内存给变量开辟了两块区域,分别为栈区域堆区域
  • 栈(stack):是栈内存的简称,栈是自动分配相对固定大小的内存空间,并由系统自动释放,栈数据结构遵循FILO(first in last out)先进后出的原则
  • 堆(heap):是堆内存的简称,堆是动态分配内存,内存大小不固定,也不会自动释放,堆数据结构是一种无序的树状结构,同时它还满足key-value键值对的存储方式;我们只用知道key名,就能通过key查找到对应的value。

2、数据类型

  • 在JS中说到堆和栈就离不开普通数据类型和引用数据类型。
  • 在JS中普通数据类型它是在栈内存在创建的,而引用数据类型则是在堆内存中创建的。
  • 基本类型:采用的是值传递。
  • 引用类型:则是地址传递。

3、腾讯面试题

第一题、

 let a = 0;
 let b = a;
 b++;
 alert(a);

结果:

"0" // 字符串0

执行分析:
请添加图片描述

  1. 在vo执行机制中采取三步走的形式:
    1.1 创建变量
    1.2 创建值
    1.3 关联
  2. 由于上述代码是普通数据类型,所以是在栈中创建
  3. 代码分析:
let a = 0;

在栈内存中创建一变量a,并赋值为0

let b = a;

在栈内存中创建一个变量b,通过指针指向0,而不是直接将a赋值给b。

b++;

b进行加1操作,得到一个新的值1,这个时候b会将指向0的那条线删除,从新指向新的值1

alert(a);

由于alert中传入其他类型的值会转换成字符串,所以结果为''a''

第二题、

let o = {};
  o.a = 0;
  let b = o;
  b.a = 10;
  alert(o.a);

结果:

"10" // 字符串10

执行分析:

请添加图片描述

  1. 在vo执行机制中采取三步走的形式:
    1.1 创建变量
    1.2 创建值
    1.3 关联
  2. 由于上述代码是引用数据类型,所以是在堆中创建
  3. 代码分析:
let o = {

};

在堆中创建一个变量o,值为空对象所以直接指向新创建出来的地址AAAFFF000

o.a  = 0;

在o对象中设置一个属性a,值为0

let b = o;

在堆中创建变量b,指向AAAFFF000这个地址

b.a = 10;

将对象中a的属性值改为10

alert(o.a)

因为它们指向的是同一个地址,所以o.a为10,优因为在alert中传入其他类型的值会转换为字符串,所以最终的结果是"10"

4、阿里面试题

 		let a = {
            n:1
        }
        let b = a
        a.x = a = {
            n:2
        }
        console.log(a.x);
        console.log(b);

结果:
在这里插入图片描述

代码分析:
请添加图片描述

请添加图片描述

  1. 由于上述代码是引用数据类型,所以是在堆中创建。
  2. 代码分析
let a = {
	n:1
}

在堆内存中创建变量a,创建AAAFFF000地址,地址中存着一个对象。

let b = a;

在堆内存中创建变量b,a将地址给了b,让b指向AAAFFF000这个地址。

a.x = a = {
n:2
}

由于a.x和a不是创建一个变量,所以直接走第二步创建值。
新建一个地址AAAFFF001,里面存在一个对象,此时AAAFFF000这个地址中新增了一个属性x
第三步:关联
AAAFFF000地址对象里面的x指向AAAFFF001,
a将指向AAAFFF000这条线抹除,从新指向新创建的地址AAAFFF001.

console.log(a.x)

这个时候a指向的是AAAFFF001这个地址,在这个地址里面的对象中并没有x这个属性,所以结果是undefined.

console.log(b)

b指向的是AAAFFF000这个地址,所以结果为:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/603087.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

长尾词挖掘,挖掘有效长尾关键词的3个方法

长尾关键词的特征是比较长,往往是2-3个词组成,甚至是短语,存在于内容页面,除了内容页的标题,还存在于内容中。 长尾关键词带来的客户,转化为网站产品客户的概率比目标关键词高很多,因此长尾…

Nginx服务

目录 一、Nginx概述 二、编译安装Nginx服务 1.安装Nginx服务 2. Nginx服务的基础命令 2.1开启nginx服务 2.2关闭nginx服务 2.3重载配置文件 2.4平滑升级 3.添加 Nginx 系统服务 3.1判断 Nginx 服务是否开启 3.2 方法一:将 nginx 服务添加到 chkconfig管…

《面试1v1》CMS垃圾回收期

我是 javapub,一名 Markdown 程序员从👨‍💻,八股文种子选手。 《面试1v1》 连载中… 面试官: 小伙子,CMS 垃圾收集器跟我讲讲? 候选人: CMS全称Concurrent Mark Sweep,是一种并发标记清除算法。它并发执…

Unity3d 有关Invoke和 Coroutine 的执行条件的误解

文章目录 认识错误的点正解测试代码执行截图 认识错误的点 之前一直以为在父物体未激活的状态下, invoke 和 Coroutine 都不会执行。这里面有一点误区。 正解 Coroutine 在父物体未激活状态下,确实不会执行。并且如果在父物体(包括祖先节点…

新手小白运行Springboot+vue项目

有时候我们会经常复刻别人的项目代码,在第一次运行别人的代码都需要哪些步骤呢? 我在第一次运行的时候踩了很多坑,也看了很多博文,这篇文章将我认为帮助较大的内容进行了一个整合,希望可以为不了解前后端分离&#xff…

【踩坑日记】【YOLO5】YOLO5 训练模型的测试结果全部相反(标签混乱)原因

问题描述 使用 labelImg 为图片数据集打上标签后交给YOLO5训练,发现测试结果中识别结果全部相反,也就是出现了标签混乱的现象。本人使用猫狗图片各 150 张作为数据集进行模型训练,训练出来的模型将所有的猫识别成了狗,所有的狗识…

【数据库从0到1】-【入门基础篇】

【数据库从0到1】-【入门基础篇】 🔻一、数据库产生背景🔻二、数据库有关概述🔻三、数据库访问接口🔻四、数据库种类🔻五、数据库有关术语🔻六、常见DBMS排名🔻七、常见数据库介绍7.1 RDS(关系型…

DVWA——Brute Force

文章目录 Brute Force(暴力(破解))(1)Low等级(2)Medium等级(3)High等级(4)Impossible Brute Force(暴力(破解&…

基于SpringBoot的三层架构开发统一响应结果

说明:三层架构开发时目前开发的主流,我这里通过一个案例,来分析非三层架构开发的不利之处,以及三层架构开发的好处。 案例说明:打开员工信息页,页面要显示所有员工的信息;前端页面已提供&#…

cs109-energy+哈佛大学能源探索项目 Part-3(探索性分析)

博主前期相关的博客见下: cs109-energy哈佛大学能源探索项目 Part-1(项目背景) cs109-energy哈佛大学能源探索项目 Part-2.1(Data Wrangling) cs109-energy哈佛大学能源探索项目 Part-2.2(Data Wrangling&a…

Java设计模式(三)

系列文章目录 迪米特法则 合成复用原则 设计原则核心思想 文章目录 系列文章目录前言一、迪米特法则1.迪米特法则基本介绍2.迪米特法则注意事项和细节 二、合成复用原则1.合成复用原则基本介绍 三、设计原则核心思想总结 前言 大家好呀,欢迎来到柚子的博客~让我们…

强化学习笔记-08 Planning and Learning

前几篇我们介绍了一个重点概念model-base和model-free,其中model-base是建立在存在某个环境模型,从模型中可以获得状态、动作、奖励的转移信息,比如动态规划方法,当我们确定了状态动作的转换概率,此时我们可以通过递归…

寄存器某个位赋值、宏定义、头文件的条件编译及全局声明extern的使用

一、给寄存器的某个位进行赋值 C语言基础知识&#xff08;位操作&#xff09; 运算符含义运算符含义&按位与~按位取反|按位或<<左移^按位异或>>右移 我们定义一个32位的寄存器变量&#xff1a;unit32_t temp0; 从左到右依次是第1位&#xff0c;第2位......第…

网络层:地址解析协议ARP

网络层&#xff1a;地址解析协议ARP 笔记来源&#xff1a; 湖科大教书匠&#xff1a;ARP协议 声明&#xff1a;该学习笔记来自湖科大教书匠&#xff0c;笔记仅做学习参考 B知道C的IP地址但如果不知道其对应的MAC地址&#xff0c;就无法将数据包发送给C&#xff0c;如何解决这个…

新款Model 3长什么样?特斯拉已经开始降价?

作者 | Amy 编辑 | 德新 马斯克时隔三年再次访华&#xff0c;期间会见了多部委领导及重量级人物&#xff0c;在北京和上海短暂停留了44小时后便离开了中国。 此前曾有多家媒体猜测马斯克可能会在中国发布/展示改款Model 3。但据彭博社报道&#xff0c;马斯克只是在上海工厂看了…

面向对象编程 实验三 sduwh 子窗口与控件的基本用法、资源的使用 参考实验报告2

源自网络收集&#xff0c;仅供参考 实验三收集到两份完整报告&#xff0c;这是其二&#xff0c;另一份见本专栏上一篇文章。 1 实验要求 整体目的&#xff1a;理解、窗口之间的消息传送、调用栈&#xff1b;掌握光标、图标、菜单的制作和使用方 式 &#xff1b; 掌 握 菜 单…

【Vue】三:Vue核心处理---vue的其它指令和自定义指令

文章目录 1.vue的其它指令1.1v-text 和 v-html1.2 v-cloak1.3 v-once1.4 v-pre 2. 自定义指令2.1 函数式2.2 对象式2.3.定义全局的指令 1.vue的其它指令 1.1v-text 和 v-html v-text&#xff1a;当做文件解析。 v-html&#xff1a;当做 HTML 代码解析。 1.2 v-cloak v-cloa…

在自定义数据集上训练 YOLOv8——完整教程

Ultralytics 最近发布了 YOLOv8 系列对象检测模型。这些模型在 COCO 数据集上的速度和准确性都优于之前版本的 YOLO 模型。但是自定义数据集的性能如何呢?为了回答这个问题,我们将在自定义数据集上训练 YOLOv8 模型。具体来说,我们将在大规模坑洞检测数据集上对其进行训练。…

电子模块|压力传感器模块HX711---C51STM32驱动

电子模块|压力传感器模块HX711---硬件介绍与C51&&STM32驱动 实物照片模块简介模块特点 软件驱动C51软件代码STM32软件代码 实物照片 模块简介 HX711是一款专为高精度称重传感器而设计的24位A/D转换器芯片。与同类型其它芯片相比&#xff0c;该芯片集成了包括稳压电源、…

Rust 标准库字符串类型String及其46种常用方法

Rust字符串 Rust主要有两种类型的字符串&#xff1a;&str和String &str 由&[u8]表示&#xff0c;UTF-8编码的字符串的引用&#xff0c;字符串字面值&#xff0c;也称作字符串切片。&#xff06;str用于查看字符串中的数据。它的大小是固定的&#xff0c;即它不能…