JS变量的内存分配你了解多少?

美国导演昆汀·塔伦蒂诺说:世界上80%的故事都已经拍过了。所以我们要用新方法去拍老故事。

JavaScript的所有变量(包括函数)在整个处理过程中都是存放在内存中,所以要对一个变量进行处理。首先得为变量分配内存。JavaScript内存分配和其他语言一样,是根据变量的数据类型来分配内存的,而JavaScript变量的数据类型由所赋的值的类型所决定的。JavaScript支持的数据类型可分为两大类:基本数据类型和复杂数据类型。其中基本数据类型包含了数字(number)类型、字符串(string)类型、布尔(boolean)类型、未定义(undefined)类型、空(null)类型;复杂类型包含了对象(object)类型,在JavaScript中数组、函数都属于对象类型。除了基本数据类型以外的数据类型全都是对象类型。在JavaScript中,基本数据类型变量分配在栈内存中,其中存放了变量的值,对其是按值访问的;而对象类型的变量则同时会分配栈内存和堆内存,其中栈内存存放的是地址。堆内存存放的是引用的值,栈内存存放的地址指向堆内存存放的值。对该变量的访问是按引用来访问的,即首先读取到栈内存存放的地址,然后按地址找到堆内存读取其中的值。

JavaScript之所以按变量的不同数据类型来分配内存,主要原因是栈内存比堆内存小,而且栈内存的大小是固定的,而堆内存大小可以动态变化。基本数据类型的值的大小固定,对象类型的值大小不固定,所以将它们分别存放在栈内存和堆内存是合理的。

1function Student (id,sno,name,age){ //函数定义,Student是一个函数变量 2   this.id = id; 3   this.sno = sno; 4   this.name = name; 5   this.age = age; 6} 7var num = 20; //num  是一个数字变量 8var bol = false; //bol 是一个布尔变量 9var str = "student"; //str 是一个字符串变量 10var obj = {}; //obj是一个对象变量 11var arr = ['a','b']; //arr是一个数组变量 12var student = new Studenta(1,"199706010016","maomin",23); //student是一个对象变量 13

上述代码中的Student变量定义了一个构造函数,函数的定义代码存放在堆内存中,该内存对应的地址存放在Student函数变量中。构造函数用于创建对象实例,最后一行代码正是使用了该构造函数来创建了一个名字叫maomin的学生对象实例。学生实例创建完后会返回其在堆内存中分配的地址,该地址被赋给了student变量。

上述代码中的{}在堆内存中创建了一个空对象,该对象的堆内存中的地址被赋给了obj的变量。['a','b']是一个元素值分别为'a','b'的数组对象,该对象也在堆内存中存放,其对应的地址赋给了arr变量。除了Studentobjarrstudent这几个变量为对象变量外,其他几个变量numbolstr都是基本数据类型的变量,因而它们都存在栈内存中。

基本数据类型的变量值存储在栈内存,而对象类型变量,包括函数、数组和对象,在栈内存中存储的只是引用对象的地址,该地址为对象在堆内存分配的地址,因而通过该地址可以找到对象类型的变量值。


欢迎关注我的公众号「前端历劫之路

回复关键词电子书,即可获取近12本前端热门电子书。

回复关键词红宝书第4版,即可获取最新《JavaScript高级程序设计》(第四版)电子书。

你还可以加我微信,我拉拢了很多IT大佬,创建了一个技术交流、文章分享群,欢迎你的加入。

  • 作者:Vam的金豆之路

  • 主要领域:前端开发

  • 我的微信:maomin9761

  • 微信公众号:前端历劫之路

本文转转自微信公众号前端历劫之路原创https://mp.weixin.qq.com/s/KmtVuavfZcpnrwp9JlxtmQ,如有侵权,请联系删除。

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )