当前位置: 首页 > news >正文

【JS】栈内存、堆内存、事件机制区别、深拷贝、浅拷贝

js中,内存主要分为两种类型:栈内存(stack)、堆内存(heap),两种内存区域在存储和管理数据时有各自的特点和用途。

栈内存

访问顺序

栈是先进后出、后进先出的数据结构,栈内存是内存用于存放临时变量的一片内存块,是一种特殊的列表,栈内元素只能通过列表的一端访问,这一端成为栈顶,另一端称为栈底。

存储数据

栈内存主要用于存储各种基本类型的变量,包括Boolean、Number、String、Undefined、Null、Symbol、BigInt以及对象变量的指针。

比如乒乓球盒子,盒子顶层的乒乓球,是最后放进去的,但可以最先被使用,如果想要取最底层的乒乓球,必须将上面的乒乓球都取出才行,这就是栈先进后出、后进先出的特点。

注意:闭包中的基本数据类型变量是在堆中,而不是在栈中;

          通过new String类似这种new出来的实例对象,也是在堆中,而不是在栈中;

堆内存

访问顺序

堆内存不同于栈,虽然都是存储的一片空间,但堆中存储变量没什么规律,只会用一块足够大的空间存储变量。js不允许直接访问堆内存中的位置。

存储数据

堆内存主要用于存储像对象Object变量类型的的存储,堆内存存储的对象类型数据对于大小这方面,一般都是未知的。

注意:闭包中的基本数据类型变量是在堆中,而不是在栈中;

          通过new String类似这种new出来的实例对象,也是在堆中,而不是在栈中;

// 基本数据类型-栈内存
let a1 = 0;
// 基本数据类型-栈内存
let a2 = 'this is string';
// 基本数据类型-栈内存
let a3 = null;
// 对象的指针存放在栈内存中,指针指向的对象存放在堆内存中
let b = { m: 20 };
// 数组的指针存放在栈内存中,指针指向的数组存放在堆内存中
let c = [1, 2, 3];

变量复制

基本类型复制

let a = 20;
let b = a;
b = 30;
console.log(a); // 此时 a 的值是多少,是 30?还是 20?
// 答案是20

 a、b都是基本类型,值是存在栈中的,a、b有各自独立的栈空间,所以修改了b的值后,a不会变化。

引用类型复制

let m = { a: 10, b: 20 };
let n = m;
n.a = 15;
console.log(m.a) // 此时 m.a 的值是多少,是10?还是15?
// 答案是15

 m、n都是引用类型,栈内存中存放的地址指向堆内存中的对象,引用类型的复制会为新的变量自动分配一个新的值保存在变量中,但只是引用类型的一个地址指针而已,实际指向的是同一个对象。

常常问到的面试题:const定义的值是否可以改

答案:部分能改,部分不能改。

  • 定义基本数据类型后,是不可修改的;
  • 定义对象时,不可修改的是指向堆内存中的地址,对象内部的属性和方法是可以修改的;

栈内存、堆内存优缺点 

栈:

  • 存储基本数据类型:Boolean、Number、String、Undefined、Null、Symbol、BigInt以及对象变量的指针。
  • 固定大小:栈内存的大小是固定的,由操作系统在程序运行时分配,数据进栈,栈顶指针移动,分配空间,数据出栈,栈顶指针反向移动,释放空间。
  • 快速访问:栈内存采用线性结构,访问数据速度非常快。
  • 自动管理:js引擎会自动管理栈内存,分配和回收空间,不需要手动介入。
  • 函数执行的时候是放在栈里执行的。

堆:

  • 存储引用数据类型:Object(包括普通对象、数组、函数)、String(通过拼接方式创建)
  • 动态大小:堆内存大小是动态的,可以根据程序的运行需求进行扩展和收缩。
  • 较慢访问:堆内存的数据是通过栈中的引用地址访问的,所以相对较慢。
  • 垃圾回收:堆内容中的变量只有在所有的引用都结束后,才会被回收。
  • 闭包中的局部变量存在堆中。

浏览器的事件机制

对象是放在堆里的,常见的基础类型和函数放在栈里,函数执行的时候,在栈里执行,栈里函数执行的时候,可能会调一些Dom操作,ajax,settimeout,这时候,要等栈里所有程序先走,走完再执行ajax,ajax执行完后,结果放在回调队列里(队列中代码,先进先执行),也就是当栈里程序走完,再从任务队列中读取事件,将队列中的事件放到执行栈中依次执行。

  • 所有同步任务都在主线程上执行,形成一个执行栈;
  • 主线程之外,还存在一个任务队列,只要异步任务有了运行结果,就在任务队列中放置一个事件;
  • 一旦执行栈里所有的同步任务执行完毕,胸痛会读取任务队列中的事件,放到执行栈中,依次执行;
  • 主线程从任务队列中读取事件,这个过程是循环不断的;
  • 宏任务、微任务属于队列,并不是放在栈中,具体看【JS】Promise与setTimeout执行顺序_js settimeout 同步执行-CSDN博客

深拷贝、浅拷贝

引用类型基本类型
数据类型数组、对象、Date、RegExp、函数、特殊的基本包装类型(String、Number、Boolean)以及单体内置对象(Global、Math)string、number、boolean、undefined、null、symbol
存储位置栈中存储引用地址,堆中存储具体值变量名称和值都存栈中
深拷贝“引用地址”和值一起拷贝,更改原对象,另一个不受影响都是深拷贝
浅拷贝只拷贝的是“引用地址”,不是值,修改两个相同引用地址,值是共享的,修改原对象,另一个对象也变---
深拷贝方法

JSON.parse(JSON.stringify(obj)):属性值为undefined的会被忽略;不支持函数、undefined、Symbol

loadsh.deep;

jquery.extend(deep,target,object);

structuredClone(obj):不支持函数;支持对象、基本数据类型

直接赋值:var a={}; b=a;
浅拷贝方法

直接赋值:var a={}; b=a;

局部作用域内直接使用全局作用域变量;

Object.assgin():一层为深拷贝,多层为浅拷贝

扩展运算符...:一层为深拷贝,多层为浅拷贝

[].concat([1,2,3])

--

相关文章:

【JS】栈内存、堆内存、事件机制区别、深拷贝、浅拷贝

js中,内存主要分为两种类型:栈内存(stack)、堆内存(heap),两种内存区域在存储和管理数据时有各自的特点和用途。 栈内存 访问顺序 栈是先进后出、后进先出的数据结构,栈内存是内存用…...

如何确保Java爬虫获得1688商品详情数据的准确性

在数字化商业时代,数据的价值日益凸显,尤其是对于电商平台而言。1688作为中国领先的B2B电子商务平台,提供了海量的商品数据接口,这些数据对于市场分析、库存管理、价格策略制定等商业活动至关重要。本文将详细介绍如何使用Java编写…...

【蓝牙通讯】iOS蓝牙开发基础介绍

1. iOS 蓝牙开发基础 在 iOS 中,蓝牙的操作主要是通过 Core Bluetooth 框架来实现。理解 Core Bluetooth 的基本组件和工作原理是学习 iOS 蓝牙开发的第一步。 核心知识点: Core Bluetooth 框架:这是 iOS 系统提供的专门用于蓝牙低功耗&am…...

Vue 90 ,Element 13 ,Vue + Element UI 中 el-switch 使用小细节解析,避免入坑(获取后端的数据类型自动转变)

目录 前言 在开发过程中,我们经常遇到一些看似简单的问题,但有时正是这些细节问题让我们头疼不已。今天,我就来和大家分享一个我在开发过程中遇到的 el-switch 使用的小坑,希望大家在使用时能够避免。 一. 问题背景 二. 问题分…...

echarts的双X轴,父级居中的相关配置

前言:折腾了一个星期,在最后一天中午,都快要放弃了,后来坚持下来,才有下面结果。 这个效果就相当是复合表头,第一行是子级,第二行是父级。 子级是奇数个时,父级label居中很简单&…...

RuoYi-Vue部署到Linux服务器(Jar+Nginx)

一、本地环境准备 源码下载、本地Jdk及Node.js环境安装,参考以下文章。 附:RuoYi-Vue下载与运行 二、服务器环境准备 1.安装Jdk 附:JDK8下载安装与配置环境变量(linux) 2.安装MySQL 附:MySQL8免安装版下载安装与配置(linux) 3.安装Redis 附:Redis下载安装与配置(…...

Linux firewalld常用命令

启动防火墙 systemctl start firewalld 停止防火墙 systemctl stop firewalld 防火墙开机自启动 systemctl enable firewalld 禁止防火墙开机自启动 systemctl disable firewalld 检查防火墙的状态 systemctl status firewalld 重新加载防火墙的配置 firewall-cmd -…...

Vue 组件之间的通信方式

Vue.js 中组件之间的通信是构建复杂应用的关键部分。以下是一些常见的Vue组件通信方式: 1. Props 和 Emit(父子组件通信) Props:父组件通过props向子组件传递数据。Emit:子组件通过emit触发事件,向父组件…...

el-select 修改样式

这样漂亮的页面,搭配的却是一个白色风格的下拉框 ,这也过于刺眼。。。 调整后样式为: 灯红酒绿总有人看着眼杂,但将风格统一终究是上上选择。下面来处理这个问题。 分为两部分。 第一部分:是修改触发框的样式 第二部…...

Java项目实战II基于微信小程序的亿家旺生鲜云订单零售系统的设计与实现(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、核心代码 五、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 随着移动互联网技术的不断…...

算法训练营day27(回溯算法03:组合总和,组合总和2,分割回文串)

第七章 回溯算法part03● 39. 组合总和 ● 40.组合总和II ● 131.分割回文串详细布置 39. 组合总和 本题是 集合里元素可以用无数次,那么和组合问题的差别 其实仅在于 startIndex上的控制题目链接/文章讲解:https://programmercarl.com/0039.%E7%BB%84%E…...

【青牛科技】D8331 流量计电路芯片,兼容 CTs,电阻分流器和罗氏线圈传感器

概述: D8331 系列超低功耗混合信号处理器由多种设备组成,具有针对电能表应用的不 同外围设备。它们集成了模拟前端和固定功能 DSP 解决方案与一个增强型 8052 单片 机核心,RTC 和 LCD 驱动程序集成在一个单一部件中。测量内核包括有功、无功…...

R语言森林生态系统结构、功能与稳定性分析与可视化实践高级应用

在生态学研究中,森林生态系统的结构、功能与稳定性是核心研究内容之一。这些方面不仅关系到森林动态变化和物种多样性,还直接影响森林提供的生态服务功能及其应对环境变化的能力。森林生态系统的结构主要包括物种组成、树种多样性、树木的空间分布与密度…...

【IntelliJ IDEA 中 Run Dashboard 不显示端口号问题解决办法】

IntelliJ IDEA 中 Run Dashboard 不显示端口号问题解决办法 解决 IntelliJ IDEA Run Dashboard 不显示端口号问题方法一:删除临时文件方法二:设置启动参数方法三:编辑 Run/Debug Configurations方法四:检查端口占用情况方法五&…...

idea中git的将A分支某次提交记录合并到B分支

一 实操案例 1.1 背景描述 在开发过程中,有时候需要将A分支某次提交记录功能合并到B分支上。主要原理用到git的cherry pick功能。 1.2 案例 实现的功能: master分支的11.24提交记录合并到feature_A分支; 1.master分支提交的记录 2.fea…...

华为关键词覆盖应用市场ASO优化覆盖技巧

在我国的消费者群体当中,华为的品牌形象较高,且产品质量过硬,因此用户基数也大。与此同时,随着影响力的增大,华为不断向外扩张,也逐渐成为了海外市场的香饽饽。作为开发者和运营者,我们要认识到…...

蓝桥杯第 23 场 小白入门赛

一、前言 好久没打蓝桥杯官网上的比赛了,回来感受一下,这难度区分度还是挺大的 二、题目总览 三、具体题目 3.1 1. 三体时间【算法赛】 思路 额...签到题 我的代码 // Problem: 1. 三体时间【算法赛】 // Contest: Lanqiao - 第 23 场 小白入门赛 …...

rest-assured multiPart上传中文名称文件,文件名乱码

rest-assured是一个基于java语言的REST API测试框架,在使用rest-assured的multipart 上传文件后,后端获取的文件名称乱码。截图如下: 原因是rest-assured multipart/form-data默认的编码格式是US-ASCII,需要设置为UTF-8。 Befo…...

CSFramework.EF高级应用: ASP.NETCore/WebApi使用动态代理技术创建多个IDatabase数据库实例

通过DI依赖注入IDatabase扩展接口,在.NET项目中使用多个数据库实例 目录 内容简介创建数据库扩展接口(继承IDatabase接口)注入IDatabase扩展接口 AddDatabase 扩展方法UseDatabase 扩展方法数据库配置文件 appsettings.json 配置文件Databas…...

神经网络入门实战:(九)分类问题 → 神经网络模型搭建模版和训练四步曲

(一) 神经网络模型搭建官方文档 每一层基本都有权重和偏置,可以仔细看官方文档。 pytorch 官网的库:torch.nn — PyTorch 2.5 documentation Containers库:用来搭建神经网络框架(包含所有的神经网络的框架)&#xff1b…...

【Oracle APEX开发小技巧12】

有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...

使用分级同态加密防御梯度泄漏

抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享

文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...

linux 下常用变更-8

1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序

一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

C# SqlSugar:依赖注入与仓储模式实践

C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...

微信小程序云开发平台MySQL的连接方式

注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...

Mobile ALOHA全身模仿学习

一、题目 Mobile ALOHA:通过低成本全身远程操作学习双手移动操作 传统模仿学习(Imitation Learning)缺点:聚焦与桌面操作,缺乏通用任务所需的移动性和灵活性 本论文优点:(1)在ALOHA…...