接着来,上第二篇笔记,欢迎各位指出错误~
同时附上evernote公开链接。
1、变量:js变量松散类型的本质,决定了变量只是在特定时间用于保存特定值的一个名字而已。
2、变量可能包含的两种数据类型的值:基本类型值和引用类型值。
-
基本类型值保存在栈内存中简单的数据段,即这种值保存在内存中的一个位置。
- 基本数据类型(5种)的值在内存中占用固定的大小,保存基本数据类型值得变量按值访问,实际操作的是保存的值。
-
引用类型值保存在堆内存中的对象,变量中保存的实际是一个指针,这个指针指向内存中的另一个位置,该位置保存着对象。
- 引用类型的值大小不固定,不能保存在栈内存中,通过访问变量保存的指针来访问保存在堆内存中的对象,是按引用访问。
- 对于保存引用类型值的变量,可以为其添加属性和方法,也可以删除(delete obj[someAttr])属性和方法。
注意区分基本类型值和引用类型值得复制,前者复制真实的值,后者复制的是指针,并有多个变量指向同一个对象。
5、js函数传递参数
- 函数传参都是按照值传递
- 在向参数传递基本类型的值时,被传递的值会被复制给一个局部变量(即命名参数,或者说是arguments对象的某一个元素)
- 在向参数传递引用类型的值是,会把这个值在内存中的地址复制给一个局部变量(命名参数,即传递的是指针),因此这个局部变量的变换会反映在函数外部。
- 可以把函数的参数想象为局部变量,参数在函数退出时立即销毁。
- 基本数据类型用typeof检测,其中检测返回"Object"时,数据类型可能是null或者Object。
- 引用数据类型用instanceof检测,返回值为true或者false eg: var car={}; console.log(car instanceof Object)//返回true
- 使用instanceof检测基本数据类型的值时,永远返回false!
- 因为instanceof检测基本类型时返回false,故可以就此判断typeof中结果为Object的null和Object类型了。
- 函数是Object
当执行流进入下列任何一个语句是,作用域链就会延长
- try-catch的catch语句中
- with语句 with语句中定义的变量,在with外也能访问
- 没有块级作用域
- 块级作用域,{ }里面定义的变量,{ }外面访问不到
- 只有函数作用域
- 函数内定义的变量,函数外访问不到
- 利用闭包,可以模拟块级作用域
- eg: function a(){ (function b(){ var c =1;})(); console.log(c); } a(); //报错,c为声明
- 多使用闭包,能避免命名冲突
9、垃圾回收机制
- 原理:找出不再使用的变量,释放其占用的内存。为此,垃圾收集器会按照固定的时间间隔(或代码执行中预定的收集时间),周期性的执行这一操作。
- 策略有二:标记清除、引用计数
- 标记清除:垃圾收集器在运行时给存储在内存中的所有变量都加上标记,然后去掉环境中的变量和被环境中的变量引用的变量的标记,最后去除带有标记的变量,销毁带标识的值和回收他们的所占的内存空间。
- 引用计数:跟踪记录每个值被引用的次数。
- 优化内存的最佳方式:为执行中的代码保存必要的数据,一旦数据不再有用,将其值设置为null来释放其引用--引用解除。
- 引用解除不意味着自动回收该值所占的内存,真正目的是让值脱离执行环境,便于垃圾收集器下次运行时将其回收。