找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1827|回复: 0

[探讨] 理解Javascript_01_理解内存分配

[复制链接]
发表于 2013-3-21 08:40:44 | 显示全部楼层 |阅读模式 来自 中国–广东–湛江
在正式开始之前,我想先说两句,理解javascript系列博文是通过带领大家分析javascript执行时的内存分配情况,来解释javascript原理,具体会涵盖javascript预加载,闭包原理,面象对象,执行模型,对象模型...,文章的视角很特别,也非常深入,希望大家能接受这种形式,并提供宝贵意见。
  原始值和引用值
  在ECMAScript中,变量可以存放两种类型的值,即原始值和引用值。原始值指的就是代表原始数据类型(基本数据类型)的值,即Undefined,Null,Number,String,Boolean类型所表示的值。引用值指的就是复合数据类型的值,即Object,Function,Array,以及自定义对象,等等。
  栈和堆
  与原始值与引用值对应存在两种结构的内存即栈和堆。栈是一种后进先出的数据结构,在javascript中可以通过Array来模拟栈的行为
  • var arr = []; //创建一个栈
  • arr.push("apple");//压入元素"apple"        ["apple"]
  • arr.push("orange");//压入元素"orange"        ["apple","orange"]
  • arr.pop();//弹出"orange"                ["apple"]
  • arr.push("banana");//压入元素"banana"        ["apple","banana"]

复制代码

  我们来看一下,与之对应的内存图:

  原始值是存储在栈中的简单数据段,也就是说,他们的值直接存储在变量访问的位置。
  堆是存放数据的基于散列算法的数据结构,在javascript中,引用值是存放在堆中的。引用值是存储在堆中的对象,也就是说,存储在变量处的值(即指向对象的变量,存储在栈中)是一个指针,指向存储在堆中的实际对象。
  例:var obj = new Object(); obj存储在栈中它指向于new Object()这个对象,而new Object()是存放在堆中的。
  那为什么引用值要放在堆中,而原始值要放在栈中,不都是在内存中吗,为什么不放在一起呢?那接下来,让我们来探索问题的答案!
  首先,我们来看一下代码:
  • function Person(id,name,age){
  •         this.id = id;
  •         this.name = name;
  •         this.age = age;
  • }
  • var num = 10;
  • var bol = true;
  • var str = "abc";
  • var obj = new Object();
  • var arr = ['a','b','c'];
  • var person = new Person(100,"笨蛋的座右铭",25);

复制代码

    然后我们来看一下内存分析图:
  
  
  变量num,bol,str为基本数据类型,它们的值,直接存放在栈中,obj,person,arr为复合数据类型,他们的引用变量存储在栈中,指向于存储在堆中的实际对象。
  由上图可知,我们无法直接操纵堆中的数据,也就是说我们无法直接操纵对象,但我们可以通过栈中对对象的引用来操作对象,就像我们通过遥控机操作电视机一样,区别在于这个电视机本身并没有控制按钮。
  现在让我们来回答为什么引用值要放在堆中,而原始值要放在栈中的问题:记住一句话:能量是守衡的,无非是时间换空间,空间换时间的问题。堆比栈大,栈比堆的运算速度快,对象是一个复杂的结构,并且可以自由扩展,如:数组可以无限扩充,对象可以自由添加属性。将他们放在堆中是为了不影响栈的效率。而是通过引用的方式查找到堆中的实际对象再进行操作。相对于简单数据类型而言,简单数据类型就比较稳定,并且它只占据很小的内存。不将简单数据类型放在堆是因为通过引用到堆中查找实际对象是要花费时间的,而这个综合成本远大于直接从栈中取得实际值的成本。所以简单数据类型的值直接存放在栈中。
  总结:
  程序很简单,但它是一切的根本,基础是最重要的,因为摩天大厦也是一块砖一块瓦的搭建起来的。内存是程序执行的根本,搞懂了内存,就等于搞懂了一切。

发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;

如何回报帮助你解决问题的坛友,好办法就是点击帖子下方的评分按钮给对方加【金币】不会扣除自己的积分,做一个热心并受欢迎的人!

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则 需要先绑定手机号

关闭

站长推荐上一条 /1 下一条

QQ|侵权投诉|广告报价|手机版|小黑屋|西部数码代理|飘仙建站论坛 ( 豫ICP备2022021143号-1 )

GMT+8, 2024-11-23 12:12 , Processed in 0.038960 second(s), 9 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表