javascript中变量的内存分配,以及const VS let
作为前端开发者,我们每天都在初始化数不尽的变量。js中有基础数据和引用数据,那么他们是在js内存中是如何分配的呢?如果是初级开发者,可能对此有些模糊不清,那么接下来可以了解下关于变量内存分配,以及const、let和var的比较。
- 内存分配位置
一般来说,我们可能认为在运行时,变量会被分配到调用栈里,然后在函数执行时调用不同的变量值来进行执行操作。其实在js中,基础类型数据是被分配到调用栈里,而引用类型数据是被分配到内存堆里的,它们是被分配到不同的地方。那么函数执行时怎么调用呢?让我们先看下面的一个问题 - 到底分配的是什么?值?还是其他
2.1 当我们定义一个变量时,var name = 'feng'
,此时内存会进行以下操作。首先定义一个标识符,然后为变量值分配一个内存地址,在改地址存储变量值。那么我们一般都认为name等于feng字符串,这是一个误区。其实是为变量name分配了一个地址值,而该地址存储的是"feng":name->地址->'feng'。那这个地址不会变,如果我们此时name = 'not feng'
,是内存继续分配另一个地址来存储新的字符串,此刻name变量的值变化为新的地址,老的地址就与name无关了。
2.2 如果我们定义一个引用类型数据变量呢var obj = {}
?会首先定义一个标识符,然后在内存堆里分配一个地址来存储引用类型数据{},然后调用栈会分配一个地址来存储在内存堆的地址,在js运行时,obj->调用栈的地址->内存堆的地址->{}。 - 执行
此时我们应该清晰了很多。当函数执行时,调用栈调用变量然后通过地址找到储存的变量值,然后再执行,就可以对变量进行任何合法的操作。 - const VS let
es6引入了const和let的定义变量的方式,让我们在某种意义上可以直接避免一些变量定义带来的问题。那么他们有什么不同?
4.1 我会倾向于,除了预测某个变量将来可变,其他的都用const。这样在代码层面,阅读者或者将来需要维护项目的朋友,可以更友好的确定,这就是他预想的代码逻辑,而不是看完一头雾水。毕竟js可是动(za)态(luan)语言。
4.2 它们会带来一个var不曾有的特性,暂时性死区。这个问题清阅读es6-let和const:暂时性死区
4.3 那么在其他语言中,常量意味着不可变性。但是const给人的是一种错觉,他无法保证定义的变量真的是不可变的。const arr = []
,我们是可以对arr进行push、shift等任何对数组的合法操作。???const不是不可变吗?const a = 'abc'
,我改动a的值肯定出错了呀?它只能保证不会被分配到新的内存地址,而不是不可操作。如果执行arr = [1]
,就报错了。它只能保证基础类型数据,例如number,string等。所以如果需要,你可以使用Object.freeze()
,来达到引用类型数据的不可变性。
javascript中变量的内存分配,以及const VS let相关推荐
- 深圳软件测试培训:JavaScript中变量和作用域
深圳软件测试培训:JavaScript中变量和作用域 JavaScript的变量与其他语言的变量有很大区别.JavaScript变量不是强制类型的,决定了它只是在特定时间用于保存特定值的一个名字而已. ...
- JavaScript中数据在内存中的存储方式
JavaScript中数据在内存中的存储方式 1.js数据类型分类 简单数据类型:Number.String.Boolean.Undefined.Null 复杂数据类型:Object.Array.Fu ...
- JAVA中堆栈和内存分配原理
JAVA中堆栈和内存分配原理 1.栈.堆 1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制. 2. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在 ...
- C语言中变量的静态分配(Static)和动态分配(StackHeap)
目录 C语言中变量的静态分配(Static)和动态分配(Stack&Heap) 变量的静态分配 包含了哪些变量? 全局变量和局部变量(staic关键字) 通过一个例子进行诠释 变量的动态分配 ...
- 在Linux内核模块中使用CMA内存分配
在Linux内核模块中使用CMA内存分配 前言 1. 什么是CMA? 2. CMA使用前的准备 2.1 内核配置选项 2.2 内核启动参数 2.3 CMA操作接口 3. 在内核模块中使用 3.1 模块 ...
- C语言中的动态内存分配
大家好,今天简单讲一讲C语言中的动态内存分配. 补充:C程序中的内存块. 在C程序中,通常将内存划分为以下六个区域: (1)内核区域.这块区域是操作系统的,用户不能使用. (2)栈区.主要用于存放运行 ...
- java 数组 内存_Java 中数组的内存分配
Java 中数组的内存分配 1.Java 程序在运行时,需要在内存中分配空间.为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据和内存管理方式. 2.数组基本概念 数组是 ...
- JavaScript中变量判断是否是数字,判断是否是整数,判断是否是正整数/负整数,判断奇数/偶数的方法
(1)判断是否是整数 JavaScript中变量判断是否是数字,判断是否是整数,判断是否是正整数/负整数,判断奇数/偶数的方法. (1)判断是否是整数 // 判断整数function isInteg ...
- javascript 声明变量var、let、const详解及示例
1. var.let.const概述 ES6发布前,Javascript只能通过var声明变量的方式,常量.块级变量.函数变量这些概念的差别都不能很好的体现出来,于此同时,加入你要使用或者提供一个ap ...
最新文章
- 22w+的人选择了这款蓝牙耳机
- 模态对话框的消息循环原理及分析笔记
- 【音频处理】离散傅里叶变换
- linux 本地端口关,Linux查看端口使用状态、关闭端口方法
- 使用Spring Boot开发邮件系统
- 王森版c语言课后题答案,《C语言编程基础第2版》王森-上机解答.doc
- 【考研】22上海大学计算机上岸记录
- BMW 与 Harvester 的云与边缘之旅
- Android 11 新特性和API兼容
- android 柱状图绘制,安卓MPAndroidChart绘制柱状图
- SQL中rand和order by rand()用法
- C#iText7对PDF进行签章
- 搜索引擎是如何工作的?
- Invalid HTTP_HOST header: ‘testserver‘. You may need to add ‘testserver‘ to ALLOWED_HOSTS
- 怎么查看linux有多少内存插槽,linux 查看内存插槽数、最大容量和频率
- Spring框架技术总结(一),java编程自学教程
- 用番茄工作法提升工作效率 (四)ToDoList的持续优化
- mysql查表里面的字段
- Office 好压 看图王 搜狗
- 端午临近,字节后端开发3+4面,终于拿到秋招第一个offer
热门文章
- C#表格table时间显示年月日时分秒格式设置
- PROCEDURE和 FUNCTION的区别
- linux清垃圾软件,似Win清理工具!Ubuntu下4个应用替代品
- word加载mythtype
- [RK3568 Android12] GT911触摸屏调试
- scratch做个简单的跑酷游戏
- CUDA安装失败,解决办法
- 洛谷——P6409 [COCI2008-2009#3] KEMIJA(java实现)
- python开篇——初识python
- python 计算器 loop_python计算器实现 Yeah