js笔记--js数据类型与内存分配(杂记)
2016-10-27 18:25
337 查看
ECMAScript变量可能包含两种不同数据类型的值:基本类型值和引用类型值。
基本类型值指的是那些保存在栈内存中的简单数据段,即这种值完全保存在内存中的一个位置。
而引用类型值是指那些保存堆内存中的对象,意思是变量中保存的实际上只是一个指针,这个指针指向内存中的另一个位置,该位置保存对象。
5种基本数据类型:Undefined、Null、Boolean、 Number和String。这5种基本数据类型的值在内存中分别占有固定大小的空间,因此可以把它们的值保存在栈内存。
如果赋给变量的是一个引用类型的值,则必须在堆内存中为这个值分配空间。由于这种值的大小不固定,因此不能把它们保存到栈内存中。但内存地址的大小是固定的,因此可以将内存地址保存在栈内存中。这样,当查询引用类型的变量时,就可以首先从栈中读取内存地址,然后再“顺藤摸瓜”地找到保存在堆中的值。
保存在栈内存中的每个值,分别占据着固定大小的空间,可以按照顺序来访问它们。如果栈内存中保存的是一块内存的地址,则这个值就像是一个指向对象在堆内存中位置的指针。保存在堆内存中的数据不是按顺序访问的,因为每个对象所需要的空间并不相等。
====================================分割一下=========================================
GC对闭包中的变量回收
1、首先闭包是一个函数,其能访问其他函数作用域中的变量
2、闭包最大用处有两个,一个是可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中
3、函数内部未被外部引用的变量,随着函数生命周期的完结而被销毁(调用之时,重新为变量分配内存,调用完即销毁,收回内存,下次继续调用的时候,重复上述周期操作),因此,受闭包影响而被调用的受闭包牵连的外部执行环境中的具名函数,其内部未进一步受牵连的变量回收不需要担心。
4、主要的是受闭包影响而被保持征用状态的受闭包牵连的外部执行环境中的变量,因存在调用该闭包函数的可能而被一直保存在内存中不被释放,因此,将该变量释放的唯一途径就是切断闭包函数被调用的可能,见例子:
基本类型值指的是那些保存在栈内存中的简单数据段,即这种值完全保存在内存中的一个位置。
而引用类型值是指那些保存堆内存中的对象,意思是变量中保存的实际上只是一个指针,这个指针指向内存中的另一个位置,该位置保存对象。
5种基本数据类型:Undefined、Null、Boolean、 Number和String。这5种基本数据类型的值在内存中分别占有固定大小的空间,因此可以把它们的值保存在栈内存。
如果赋给变量的是一个引用类型的值,则必须在堆内存中为这个值分配空间。由于这种值的大小不固定,因此不能把它们保存到栈内存中。但内存地址的大小是固定的,因此可以将内存地址保存在栈内存中。这样,当查询引用类型的变量时,就可以首先从栈中读取内存地址,然后再“顺藤摸瓜”地找到保存在堆中的值。
保存在栈内存中的每个值,分别占据着固定大小的空间,可以按照顺序来访问它们。如果栈内存中保存的是一块内存的地址,则这个值就像是一个指向对象在堆内存中位置的指针。保存在堆内存中的数据不是按顺序访问的,因为每个对象所需要的空间并不相等。
====================================分割一下=========================================
GC对闭包中的变量回收
1、首先闭包是一个函数,其能访问其他函数作用域中的变量
2、闭包最大用处有两个,一个是可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中
3、函数内部未被外部引用的变量,随着函数生命周期的完结而被销毁(调用之时,重新为变量分配内存,调用完即销毁,收回内存,下次继续调用的时候,重复上述周期操作),因此,受闭包影响而被调用的受闭包牵连的外部执行环境中的具名函数,其内部未进一步受牵连的变量回收不需要担心。
4、主要的是受闭包影响而被保持征用状态的受闭包牵连的外部执行环境中的变量,因存在调用该闭包函数的可能而被一直保存在内存中不被释放,因此,将该变量释放的唯一途径就是切断闭包函数被调用的可能,见例子:
var _zi = (function () { var laozi = "hehe"; function _tai() { var inner = -1;//inner变量无外部更深层次的调用,因此会随着_tai函数的调用而被不断创建和销毁 laozi = Math.ceil(Math.random() * 10); console.log("fuck laozi:" + laozi); } return { "fun_1": function () { console.log(laozi); }, "fun_2": _tai, "delete": function () { laozi = null; } } })(); _zi.fun_2();//变量laozi因闭包函数_zi.fun_2可能被被调用,未被销毁而会一直存在 _zi.fun_2();//变量laozi因闭包函数_zi.fun_2可能被被调用,未被销毁而会一直存在 _zi.fun_1();//变量laozi因闭包函数_zi.fun_1可能被被调用,未被销毁而会一直存在 _zi.delete();//即使将变量laozi置为null,但仍存在被调用的可能,其作为js基本数据类型,仍然会在栈内存中暂用一定空间 _zi.fun_1();//null,依然霸占着栈内存的一个位置 _zi.fun_2();//变量laozi又被重新赋值,依然霸占着栈内存的一个位置 _zi = null;//将_zi赋值为null,此举切断闭包函数被调用的可能,此时变量laozi 才真正意义上被释放,被GC回收,匿名自执行函数内的所有变量都将被回收
相关文章推荐
- 浅谈js基础数据类型和引用类型,深浅拷贝问题,以及内存分配问题
- Js面向对象和数据类型内存分配(转)
- js数据类型,及内存存储学习笔记
- javascript复习笔记(一)js基础,基本语法,数据类型,控制流程
- 类是数据类型,对象是内存的具体分配
- js基础笔记 javascript数据类型
- 类是数据类型,对象是内存的具体分配
- 韩顺平_轻松搞定网页设计(html+css+javascript)_第20讲_js基本数据类型_js运算符1_学习笔记_源代码图解_PPT文档整理
- js 数据类型转换总结笔记
- 数据类型回顾——JS学习笔记2015-6-1(第45天)
- java 笔记(1)-—— JVM基础,内存数据,内存释放,垃圾回收,即时编译技术JIT,高精度类型
- js学习笔记___基本数据类型与使用
- Ferris教程学习笔记:js示例3.1 用typeof查看数据类型
- Java基本数据类型的内存分配
- String对象内存分配和基本数据类型的默认值与初始化相关问题
- 数据类型回顾之parseIng&parseFloat——JS学习笔记2015-6-2(第46天)
- C学习笔记2-int类型数据在内存中的存储形式
- JavaScript高级程序设计(第3版)学习笔记3 js简单数据类型
- J2SE基础篇——数据类型、运算符、语句、程序执行时内存分配、进制、编码
- js数据类型隐式转换笔记以及js包装对象