首页 > 代码库 > <JS高级程序设计3>_PART4

<JS高级程序设计3>_PART4

1.基本数据类型:Undefined,null,Number,String,Boolean.引用数据类型:保存在内存中的对象.

2.JS不允许直接访问内存中的位置,不能直接操作对象的内存空间.所以操作对象时,实际上是操作的对象的引用,而不是实际的对象.

3.

var num1 = 1;

var num2 = num1;

一个基本类型的变量向另一个赋值时,执行了复制操作,两个变量互不影响.

var obj1 = new Object();

var obj2 = obj1;

obj1.age = 29;

alert(obj2.name); //29

当一个变量向另一个变量赋值引用类型时,会把obj1复制一份放到obj2的空间里.但是他俩用的是一个指针,指向的Object.

4.函数的参数都是按值传递,不管基本类型还是引用类型.

function a(temp) {

temp += 1;

return temp;

}

var num = 2;

var result = a(num);

alert(num); //2

alert(result); //3

如果是用的按引用方式,则num的值为3.为2的话,证明他俩是两个独立的空间,而不是复制指针指向同一个对象.

function setName(tempObj){

tempObj.name = "zhangsan";

}

var obj1 = new Object();

setName(obj1.name); //zhangsan

从以上代码来看,似乎形参为对象时,是按引用传递.

function setName(tempObj) {

tempObj.name = "zhangsan";

obj = new Object();

obj.name = "lisi";

}

var obj1 = new Object();

setName(obj1);

alert(obj1.name); //zhangsan

虽然setName方法内部又创建新对象,按照引用传递的观点,指针都指向同一个对象,那么最后obj.name="lisi",结果应该也是lisi,可却是zhangsan.证明函数参数的值为对象时,也是按值传递.

5.用instanceof检测变量是什么类型的对象.

6.JS是链式环境.

7.try catch语句的catch块和with语句可以延长作用域链

8.JS没有块级作用域.

if(true) {

var color = "red";

}

alert(color); //red;

 

for(var i=0; i<2; i++) {

...

}

alert(i); //2

9.函数的局部变量,外部无法访问.

10.函数内部用的变量如果没var,则按作用域链的前端开始向上逐级查询,一直追溯到全局环境.所以函数内部可以直接用外部定义的变量.