ECMAScript变量分为两种不同数据类型的值:基本类型值和引用类型值。
基本数据类型:Undefined,Null,Boolean,Number,String,按值访问
引用数据类型:对象,按引用访问
ECMAScript中所有函数的参数都是按照值传递的。也就是说,把函数外部的值复制到函数的内部的参数,就和把值从一个变量复制到另一个变量一样。
function setName(obj){
obj.name = "zhang";
obj = new Object();
obj.name = "greg";
}
var person = new Object();
setName(person);
console.log(person.name);
检测基本类型的方法:typeof;
检测什么类型对象的方法:instance;
基本类型值在内存中占据固定大小的空间,因此被保存在栈空间;
从一个变量向另一个变量复制基本类型的值,会创建这个值得一个副本;
引用类型的值是对象,保存在堆内存中;
包含引用类型值得变量实际上包含的并不是对象本身,而是一个指向给对象的指针;
从一个对象向另一个对象复制引用类型的值,复制的其实是指针,因此两个变量最终都指向同一个对象;
确定一个值是那种基本类型用typeof操作符,确定一个值是那种引用类型可以使用instanceof操作符。
“标记清除”是目前主流的垃圾收集算法,思想是给当前不适用的值加上标记,然后在回收其内存。
另一种垃圾收集算法是“引用计数”,这种算法的思想是跟踪记录所有制被引用的次数。JavaScript引擎目前都不在使用这种算法,但在IE中访问非原生JavaScript对象(如DOM元素)时,这种算法仍然会导致问题。
解除变量的引用不仅有助于消除循环引用对象,而且对垃圾收集有好处。