理解JavaScript内存空间

写在前面

在JavaScript中,内存是一个容易被忽视的概念,但是要想让自己的代码更优化,理解js的存储空间十分重要。
首先我们先看一个常见的例子。

      var a=20;
      var b=a;
      b=30;
      console.log(a);
Q1,a的值是多少?
      var m={a:10,b:20};
      var n=m;
      n.a=15;
      console.log(m.a);
Q2,m.a的值是多少?

堆与栈


  1. 可以这样通俗的解释堆的概念,把存储空间 栈 比作一个乒乓球桶,遵循先进后出。函数的执行上下文也是存储在栈中的。

  2. 堆则可以与书架作类比,我们在从书架取书时不需要按次序将每本书一次取出来,我们只需要知道书名字,就可以直接从书架中将书取出。堆的概念就是如此。

变量对象与基础数据类型

JavaScript在创建执行上下文时,会创建一个叫变量对象的特殊对象,JavaScript的基础数据类型都会存储在变量对象中,也可以说是存放在栈中。基础数据类型包括Number,String,Boolean,Null和Undefined。基础数据类型都是按值访问的。

堆内存与引用数据类型

与其它语言不同,JavaScript的引用数据类型,比如数组,他们的值的大小是不固定的。引用数据类型的值是存储在堆内存中的对象,而JavaScript不允许直接访问堆内存中的对象。因此,实际上我们在操作中,引用数据类型的值不是真正的存放在堆内存中的对象,而是对象的引用。可以理解为是一个堆内存中对象对应的地址。
在这里插入图片描述


回到开篇我们的问题中去。
在Q1中,先声明变量并赋值,var a=20 ,然后将a的值赋值给b,此时b的值是20,然后再将30赋值给b,此时b=30。但是a的值并没有受到影响,所以a的值还是20。
在这里插入图片描述
再Q2中,同样执行了一个将m赋值给n的赋值操作,这里我们可以这样理解,此时的赋值操作仅仅是将a,b在变量对象中的地址引用赋值给n。当地址相同时,虽然是两个不同的变量,但是他们存储在堆内存中的还是同一个值,即n={a:10,b:20}。因此改变n中a的值的时候,m的值也会发生变化,因为m和n是对应的是同一个地址。
在这里插入图片描述
所以,m.a也会跟着改变,m.a=15。
下面是《JavaScript高级程序设计》一书中对复制变量值的讲解:
1.基本数据类型

在这里插入图片描述
2.引用数据类型
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值