学习了第四章和第五章的内容
垃圾收集
JavaScript具有自动垃圾收集机制,局部变量只在函数执行的过程中存在,在此过程中,会为局部变量在栈(或堆)内存上分配相应空间,以便存储他们的值。当函数执行结束后,局部变量就没有存在的必要了,因此就可以释放他们的内存以供将来使用。垃圾收集的策略目前主要有两种:
标记清除:JavaScript中最常用的。垃圾收集器在运行的时候会给存储在内存中的所有变量都加上标记,然后,它会去除掉环境中的变量和被环境中其他变量所引用的变量标记。在此之后再被加上标记的变量将被视为是要删除的。最后垃圾收集器完成内存清除工作,销毁那些带标记的值,并回收他们的内存。
引用计数:跟踪记录每个值被引用的次数。当声明了一个变量并将一个引用类型值赋给该变量时,则这个值引用次数是1,如果同一个值又被赋予了另外一个,则次数加1,。相反,如果包含这个值引用的变量又得到了另外的一个值,则引用次数就减1.当这个值为0的时候,就说明没有办法再访问这个值了,因此就可以将其内存回收过来。(然而当出现循环引用的时候,引用计数就无法进行垃圾回收了)
此外,因为IE中有的对象不是原生的JavaScript对象,如BOM和DOM中的对象时用C++以COM(组件对象模型)对象形式来实现的,而COM就是用引用计数
var element=document.getElementById(‘some_element‘); var myobject=new Object(); //下面创建了循环引用 myobject.element=element; element.someObject=myobject; //为了避免因为循环引用而无法回收内存,在使用它们的时候,手动清除 myobject.element=null; element.someObject=null;
关于优化内存,因为出于安全的考虑,并不会为浏览器分配太多的内存,因此内存就显得很珍贵。优化内存的最佳方式,就是执行中的代码保存必要的数据。一旦数据不再有用,最好通过将其设置为null来释放其引用,该方法叫解除引用。适用于大多数全局变量和全局对象的属性。
function createPerson(name){ var locationPerson=new Object(); locationPerson=name; return locationPerson; } var globalPerson=createPerson(‘mike‘); //手工解除 globalPerson=null;
Array中的几种方法
栈方法:后入先出,用到的就是push()和pop()方法,前者是将添加到数组的末尾,而后者是将数组末尾的项移除。
队列方法:先进先出,使用的是push()和shift(),其中shift能够移除数组中的第一项并返回该项,同时数组长度减1.
重排序方法:reverse()和sort(),前者是反转数组,而后者是默认以升序排列数组。sort()有时候并不能得到我们想要的结果,因此它接受一个比较函数,比较函数有两个参数,如果参数1应该位于参数2之前,则为负数;如果应该在之后,则为正数,平则为0;
function compare(obj1,obj2){ var val1=obj1[propertyName]; var val2=obj2[propertyName]; if(val1<val2){ return -1; }else if(val1>val2){ return 1; }else{ return 0; } } Arr.sort(compare);
对于数组有一个功能强大的方法 splice(),用法有三种:
删除:只需要制定2个参数,第一个参数为其实位置,第二个参数为删除的个数;如splice(2,1)
插入:接受3个参数,前2个参数意义一样,只需要将第二个参数设置为0,第三个参数为要插入的项,可以再传入第四,第五,任意个。如splice(“2”“0”“blue”“red”)
替换:第二个参数设置要替换的个数,然后第三个参数同上 splice(“3”“1“”blue“”red”);
数组的5个迭代方法:every, filter forEach map some;传入这些方法中的函数都接受三个参数:数组项的值、该项在数组中的位置和数组对象本身。其中every和some很相似,不同是,some只要有一项为true则返回true,而every是要每个都为true。map对数组一项运行指定函数的方法,返回调用结果的数组。filter返回的是true项组成的新数组。这些方法都不会改变原数组。