基本类型和引用类型的值
基本类型:简单的数据段
引用类型:指可能由多个值构成的对象
- 对于引用类型的值:我们可以为其添加属性和方法,但是我们不能给基本类型的值添加属性,尽管这样做不会导致错误.
复制基本类型的值
var num1 = 5;
var num2 = num1;
复制引用类型的值
var obj1 = new Object();
var obj2 = obj1;//obj1和obj2都指向同一个对象
obj1.name = "Tom";
alert(obj2.name);//"Tom"
传递参数
ECMAScript中所有的函数都是按值传递的
参数是基本类型
function addTen(num){
num += 10;
return num;
}
var count = 10;
addTen(count);
alert(count);//10,不变
alert(num);//20
参数是对象
function setName(obj){
obj.name = "Tom";
}
var person = new Object();
setName(person);
alert(person.name);//"Tom"
在上述代码中,在局部作用域中修改的对象在全局作用域中反映了出来,难道这里是按引用传递吗?
为什么上面参数是基本类型时,全局变量count在函数中被调用后值没有改变,
而当函数参量是引用类型时,全局变量person在函数中被调用后属性就改变了呢?
它还是按值传递吗?
变量person在被传递到setName()函数之后就被复制给了obj.在函数内部,obj和person引用的时同一个对象.换句话说,即使这个变量是按值传递的,obj也会按引用来访问同一个对象.
所以,当在函数内部为obj添加name属性后,全局变量person也将有所反映.
检测类型
操作符instanceof,用来检测是什么类型的对象
alert(person instanceof Array);//变量person是Array吗?
执行环境及作用域链
执行环境:
定义了变量或函数有权访问的其他数据,决定了他们各自的行为
变量对象:
每个执行环境都有与之关联的变量对象,环境中定义的所有变量和函数都保存在这个对象中.
函数与其执行环境
每个函数都有自己的执行环境.当执行流进入一个函数时,函数的环境就会被推入一个环境栈中.而在函数执行之后,栈将其环境弹出,把控制权返会给之前的执行环境.
作用域链:
当代码在一个环境中执行时,会创建变量对象的一个作用域链.作用域链的用途是保证对执行环有权访问的所有变量和函数的有序访问.
var color = "blue";
function changeColor(){
var anotherColor = "red";
function swapColors(){
var tempcolor = anotherColor;
anotherColor = color;
color = tempColor;
//这里可以访问color,anotherColor,tempColor
}
//这里可以访问color,anotherColor
swapColors();
}
//这里只能访问color
changeColor();
上述代码中,涉及三个执行环境:全局环境,changeColor()的局部环境和swapColors()的局部环境,作用域链: