作为前端开发者,我们每天都在初始化数不尽的变量。js中有基础数据和引用数据,那么他们是在js内存中是如何分配的呢?如果是初级开发者,可能对此有些模糊不清,那么接下来可以了解下关于变量内存分配,以及const、let和var的比较。

  1. 内存分配位置
    一般来说,我们可能认为在运行时,变量会被分配到调用栈里,然后在函数执行时调用不同的变量值来进行执行操作。其实在js中,基础类型数据是被分配到调用栈里,而引用类型数据是被分配到内存堆里的,它们是被分配到不同的地方。那么函数执行时怎么调用呢?让我们先看下面的一个问题
  2. 到底分配的是什么?值?还是其他
    2.1 当我们定义一个变量时,var name = 'feng',此时内存会进行以下操作。首先定义一个标识符,然后为变量值分配一个内存地址,在改地址存储变量值。那么我们一般都认为name等于feng字符串,这是一个误区。其实是为变量name分配了一个地址值,而该地址存储的是"feng":name->地址->'feng'。那这个地址不会变,如果我们此时name = 'not feng',是内存继续分配另一个地址来存储新的字符串,此刻name变量的值变化为新的地址,老的地址就与name无关了。
    2.2 如果我们定义一个引用类型数据变量呢var obj = {}?会首先定义一个标识符,然后在内存堆里分配一个地址来存储引用类型数据{},然后调用栈会分配一个地址来存储在内存堆的地址,在js运行时,obj->调用栈的地址->内存堆的地址->{}。
  3. 执行
    此时我们应该清晰了很多。当函数执行时,调用栈调用变量然后通过地址找到储存的变量值,然后再执行,就可以对变量进行任何合法的操作。
  4. 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相关推荐

  1. 深圳软件测试培训:JavaScript中变量和作用域

    深圳软件测试培训:JavaScript中变量和作用域 JavaScript的变量与其他语言的变量有很大区别.JavaScript变量不是强制类型的,决定了它只是在特定时间用于保存特定值的一个名字而已. ...

  2. JavaScript中数据在内存中的存储方式

    JavaScript中数据在内存中的存储方式 1.js数据类型分类 简单数据类型:Number.String.Boolean.Undefined.Null 复杂数据类型:Object.Array.Fu ...

  3. JAVA中堆栈和内存分配原理

    JAVA中堆栈和内存分配原理 1.栈.堆 1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制. 2. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在 ...

  4. C语言中变量的静态分配(Static)和动态分配(StackHeap)

    目录 C语言中变量的静态分配(Static)和动态分配(Stack&Heap) 变量的静态分配 包含了哪些变量? 全局变量和局部变量(staic关键字) 通过一个例子进行诠释 变量的动态分配 ...

  5. 在Linux内核模块中使用CMA内存分配

    在Linux内核模块中使用CMA内存分配 前言 1. 什么是CMA? 2. CMA使用前的准备 2.1 内核配置选项 2.2 内核启动参数 2.3 CMA操作接口 3. 在内核模块中使用 3.1 模块 ...

  6. C语言中的动态内存分配

    大家好,今天简单讲一讲C语言中的动态内存分配. 补充:C程序中的内存块. 在C程序中,通常将内存划分为以下六个区域: (1)内核区域.这块区域是操作系统的,用户不能使用. (2)栈区.主要用于存放运行 ...

  7. java 数组 内存_Java 中数组的内存分配

    Java 中数组的内存分配 1.Java 程序在运行时,需要在内存中分配空间.为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据和内存管理方式. 2.数组基本概念 数组是 ...

  8. JavaScript中变量判断是否是数字,判断是否是整数,判断是否是正整数/负整数,判断奇数/偶数的方法

    (1)判断是否是整数  JavaScript中变量判断是否是数字,判断是否是整数,判断是否是正整数/负整数,判断奇数/偶数的方法. (1)判断是否是整数 // 判断整数function isInteg ...

  9. javascript 声明变量var、let、const详解及示例

    1. var.let.const概述 ES6发布前,Javascript只能通过var声明变量的方式,常量.块级变量.函数变量这些概念的差别都不能很好的体现出来,于此同时,加入你要使用或者提供一个ap ...

最新文章

  1. 22w+的人选择了这款蓝牙耳机
  2. 模态对话框的消息循环原理及分析笔记
  3. 【音频处理】离散傅里叶变换
  4. linux 本地端口关,Linux查看端口使用状态、关闭端口方法
  5. 使用Spring Boot开发邮件系统
  6. 王森版c语言课后题答案,《C语言编程基础第2版》王森-上机解答.doc
  7. 【考研】22上海大学计算机上岸记录
  8. BMW 与 Harvester 的云与边缘之旅
  9. Android 11 新特性和API兼容
  10. android 柱状图绘制,安卓MPAndroidChart绘制柱状图
  11. SQL中rand和order by rand()用法
  12. C#iText7对PDF进行签章
  13. 搜索引擎是如何工作的?
  14. Invalid HTTP_HOST header: ‘testserver‘. You may need to add ‘testserver‘ to ALLOWED_HOSTS
  15. 怎么查看linux有多少内存插槽,linux 查看内存插槽数、最大容量和频率
  16. Spring框架技术总结(一),java编程自学教程
  17. 用番茄工作法提升工作效率 (四)ToDoList的持续优化
  18. mysql查表里面的字段
  19. Office 好压 看图王 搜狗
  20. 端午临近,字节后端开发3+4面,终于拿到秋招第一个offer

热门文章

  1. C#表格table时间显示年月日时分秒格式设置
  2. PROCEDURE和 FUNCTION的区别
  3. linux清垃圾软件,似Win清理工具!Ubuntu下4个应用替代品
  4. word加载mythtype
  5. [RK3568 Android12] GT911触摸屏调试
  6. scratch做个简单的跑酷游戏
  7. CUDA安装失败,解决办法
  8. 洛谷——P6409 [COCI2008-2009#3] KEMIJA(java实现)
  9. python开篇——初识python
  10. python 计算器 loop_python计算器实现 Yeah