变量包含两种不同数据类型的值
- 基本类型值(undefined,null,boolean,number,string) 引用类型值(object)
例
- obj1,obj2 引用了同一个对象 //访问变量有按值和按引用两种方式
var obj1 = new Object();
var obj2 = obj1;
function setName(obj){ //参数只能按值传递,为局部变量
obj.name = 'Nicholas';
obj = new Object();
obj.name = 'Greg';
}
var person = new Object();
setName(person);
alert(person.name); //'Nicholas'
- 检测类型 -P77
- typeof ?
检测基本的数据类型 - ? instanceof ?
检测对象的类型
任何对象 instanceof Object -> true
colors instanceof Array -> true
pattern instanceof RegExp -> true
? instanceof 基本数据类型 -> false
- typeof ?
执行环境和作用域
- 在web浏览器中,全局执行环境为window对象
- 每个函数都有自己的执行环境
- 作用域链是保证对执行环境有权访问的所有变量和函数的有序访问
- 当前执行环境中可以访问上n层执行环境的变量和函数
- 延长作用域链 with,catch
function buildUrl(){
var a = '?a=a';
with(location){
var url = href + a;
}
return url; //执行with语句时,location被添加到作用域链前端,with语句结束则移除
}
没有块级作用域
if(true){ var color = 'blue'; } alert(color); //'blue' 在if语句中定义的color,c、java中color会在if执行完销毁,javascript中不会 for(var i = 0;i < 1;i++){ var j = 1; } alert(i+j); //2
- 严格模式下未初始化直接使用的变量会报错
垃圾收集
- 标记清除
当变量进入环境时,标记为‘进入环境’,离开环境时,标记为‘离开环境’ - 引用计数
当声明一个变量并赋值时,这个值的引用次数是1,同一个值又给付给另一变量,该值引用次数加1,相反,如果包含这个值的变量取得另一个值,则这个值引用次数减1,当引用次数为0时,则可以回收 循环引用问题
function problem(){ var A = new Object(); var B = new Object(); A.obj = B; B.obj = A; //两个对象的引用都为2 A=null; B=null; //两个对象的引用都为1,不能被回收 }
- 管理内存
解除引用:一当数据不在有用,最好通过将其值设置为null来释放引用,让值脱离执行环境,以便垃圾收集器下次运行时将其回收