JavaScript的变量包含两种数据类型的值:基本类型值和引用类型值
基本类型值:Boolean、Null、Undefined、Number、String
在内存中占据固定大小的空间,保存在栈中
引用类型值:Object
保存在堆中
对于引用对象,JavaScript不允许直接访问内存中位置,也就是说不能直接操作对象的内存空间,操作的时候实际上是操作对象的引用,而不是直接操作对象,但也有例外,如果你给这个对象添加属性,其实也就是在操作对象。
也只有引用类型可以动态添加属性!!!
基本类型值的复制:
var num1=5;
var num2=num1;
num1和num2在内存上是完全独立的两个空间
引用类型值的复制:
var object1=new Object();
var object2=object1;
object1.name="mack";
alert(object2.name);
按照上面的写法,object1仅仅是这个对象的指针,object是内存里面这个对象的另一个指针,实际操作的都是同一个对象!!!所谓的指针也就是一个地址而已。
所有函数的参数都是按照值传递的,像对象这种引用类型值作为参数传递,也是值传递,函数作用域内,即使重写了该对象,函数结束后也立即销毁了!!!
typeof是用来检测数据是什么基本类型的,如果检测数据是不是对象(引用类型),可以用instanceof来检测!typeof检测正则表达式,返回的是"function",IE和Firefox浏览器,返回的是object.
作用域,作用域链,全局和局部就好比大环境和小环境,小环境发掘大环境里的资源是可以的,大环境无权探索小环境里的资源,就这么简单!!!
JavaScript是没有会计作用域的,如下:
if(true){
var color="red";
}
alert(color);
执行下面这段话,color依旧是有值的!!!这就是为什么for循环的i值仍然是可以访问到的原因!!!
如果一个变量没有用var去声明的话,它就是全局变量,但是这种做法并不提倡,因为有的时候会报错。
搜寻标识符,其实是先从局部搜寻,搜寻不到在到全局搜,不管怎么样,反正是从里到外的搜,直到搜到为止,搜到了就不继续搜了,搜不到就报错了!
var color="blue";
function getColor(){
return color;
}
alert(getColor());
or
var color="blue";
function getColor(){
var color="red";
return color;
}
alert(getColor());
Javascript有自己的垃圾收集机制,就是说充分利用内存,和释放内存!!!
它的策略有两个:
标记清除:
就是变量使用的时候,给做一个进入环境的标记,不使用了,就打一个离开环境的标记,该内存就释放了。
引用计数(不用了):
这种情况是变量被赋予了引用类型值得时候才体现的,刚被赋予的时候引用次数+1,如果同一个值又被赋予了两一个变量,就在+1,如果后边引用的变量引用了其他的引用类型值了,那么一开始的引用次数就要-1了。当引用次数变为0的时候,就说明不需要了,该释放了!!!
引用计数的最大问题其实是循环引用问题,如果A对象和B对象,分别在各自的对象中引入了各自的指针,那么就无法做到引用次数为0,那么就永远都是占用内存,实在太不友好了。
function(){
var a=new object();
var b=new object();
a.getB()=b;
b.getA()=a;
}
手工清除避免内存泄露的方法就是
a.getA()=null;
b.getB()=null;
垃圾收集机制是周期性循环复始的,如果你想要立刻执行垃圾收集那么只需要一句话:
window.CollectGarbage();
解除引用:
function createPerson(name){
var LocalPerson=new Object();
localPerson.name=name;
return localPerson;
}
var globalPerson =createPerson("simalinjia");
//用完了以后要
globalPerson=null;
最后一句话的目的是让值脱离执行环境,以便垃圾收集器下次运行时将其回收!