先放一张图片作为引入:

这里我用了一个示意图作为讲解:

平时,我们写的变量为什么能在我们调用它的时候就能被我们拿到所用,跟存钱罐一样,你往里面存一元大洋,它里面就有一元大洋,那么我们的变量在被我们创建出来的时候被存放在哪呢?内存!内存被分为几大块,只是我们平时不知道,内存大体被分为几大块,其中有三大块我们经常用到,栈区,堆区,常量区。

首先,我创建了个变量,上图的 num 当我 var num : Number 的时候这个时候,我们只是简单的创建了一个变量,这个时候的变量是没有任何意义的,它只是在栈区里开辟了一块内存,给这段内存一个标记 num ,接下来我们要对它进行赋值,如 : var num : Number = 123; 当我们给它赋值的时候,实际内存为我们在堆区里开辟了一块内存,这时候内存里放的才是真正我们所需要的值 123 ,这个时候栈里的变量 num 引用了堆里的值 123 ,这个时候才是真正的符合我们的需要。

在内存里还有一块区域叫 常量区 ,里面放置了一些恒古不变的数据当我们的var str:String = null;的时候,这个时候引用了我们常量区里的值null,而并没有引用我们堆里的值,所以这个时候我们的str变量并没有引用到具体的一个值,这个时候str也并没有被初始化,而下面的str1它引用的空值,实际上,内存已经为它在堆区里开辟了一块内存,只是这个时候放的是空值,用个小测试就能得到这个证明:

var str:String = null;
var str1:String = "";
trace(str.length);
trace(str1.length);

str 返回 undefined;

str1返回0;

还有个问题我也要特别提醒一些新手,new 这个关键字我相信大家已经非常熟悉了,new 的真正意义是什么呢?

实际上你每 new 一次,就相当于在堆区里开辟一个存储空间至于存储的什么类型,那就是你 new 什么类型,里面放的就什么类型。

其实上面的 num, str 它直接赋值只是你们看到的假象,在Flash的内核里实际上它帮你做了自动转换,如:
var num:Number = 123; 它实际上帮你做的事是 var num : Number = new Number(123); 只是它是隐式的,你看不到罢了
简单的记住,我们通过给变量赋值,就是通过栈区里的变量引用堆区里的值。

以上是本人简单的做了下讲解,希望对大家有帮助,关于内存分区的内容太多,这里就不一一讲解了,有兴趣的朋友可以查阅相关资料进行加深理解。

最新文章

  1. [Android]使用Dagger 2依赖注入 - 图表创建的性能(翻译)
  2. c语言数据结构之 快速排序
  3. JavaScript 之 for语句
  4. HTML页面跳转的5种方法
  5. Swift-打开其它Storyboard中的自定义模态窗口
  6. SSO(单点登录)
  7. RFID Hacking③:使用ProxMark3嗅探银行闪付卡信息
  8. Chrome插件开发入门(二)——消息传递机制
  9. pdf转chm的实现方法
  10. servlet:从入门到实战学习(1)---全·环境配置
  11. 读书共享 Primer Plus C-part 4
  12. Spring的注解@Qualifier小结
  13. leetcode之旅(9)-Reverse Linked List
  14. 重磅!!!微软发布ASP.NET Core 2.2,先睹为快。
  15. SQLSVR 之 EXISTS
  16. 初级安全入门——Windows操作系统的安全加固
  17. netty4初步使用
  18. Markdown之语法入门篇
  19. objgraph无法生成分析图的原因
  20. 最新Flume1.7 自定义 MongodbSink 结合TAILDIR Sources的使用

热门文章

  1. MySQL高可用之MHA的搭建 转
  2. Reservoir Sampling - 蓄水池抽样
  3. 类string的构造函数、拷贝构造函数和析构函数
  4. CF 335A(Banana-贪心-priority_queue是大根堆)
  5. LeetCode45 Jump Game II
  6. 利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
  7. 【阿里云产品公测】弹性伸缩服务ESS之试用初体验
  8. 阿里云ECS(linux)磁盘满触发的mysql的表异常修复案例
  9. ASP.NET通过byte正确安全的判断上传文件格式
  10. ASP.NET页面与IIS底层交互和工作原理详解(第一回)