龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > web编程 > Javascript编程 >

JavaScript内核之基本概念(1)(2)

时间:2013-03-06 14:58来源:未知 作者:admin 点击:
分享到:
2.1.4类型的判断 前面讲到JavaScript特性的时候,我们说过,JavaScript是一个弱类型的语言,但是有时我们需要知道变量在运行时的类型,比如,一个函数的参

2.1.4类型的判断

前面讲到JavaScript特性的时候,我们说过,JavaScript是一个弱类型的语言,但是有时我们需要知道变量在运行时的类型,比如,一个函数的参数预期为另一个函数:

  1. <strong>function handleMessage(message, handle){  
  2.     return handle(message);  
  3. }</strong> 

当调用handleMessage的函数传递的handle不是一个函数则JavaScript引擎会报错,因此我们有必要在调用之前进行判断:

  1. <strong>function handleMessage(message, handle){  
  2.     if(typeof handle == "function"){  
  3.        return handle(message);   
  4.     }else{  
  5.        throw new Error("the 2nd argument should be a function");  
  6.     }  
  7. }</strong> 

但是,typeof并不总是有效的,比如下面这种情况:

  1. <strong>var obj = {};  
  2. var array = ["one""two""three""four"];  
  3.    
  4. print(typeof obj);//object  
  5. print(typeof array); //object</strong> 

运行结果显示,对象obj和数组array的typeof值均为”object”,这样我们就无法准确判断了,这时候,可以通过调用instanceof来进行进一步的判断:

  1. print(obj instanceof Array);//false  
  2. print(array instanceof Array);//true 

第一行代码返回false,第二行则返回true。因此,我们可以将typeof操作符和instanceof操作符结合起来进行判断。

2.2 变量

变量,即通过一个名字将一个值关联起来,以后通过变量就可以引用到该值,比如:

  1. <strong>var str = "Hello, World";  
  2. var num = 2.345;</strong> 

当我们下一次要引用”Hello, Wrold”这个串进行某项操作时,我们只需要使用变量str即可,同样,我们可以用10*num来表示10*2.345。变量的作用就是将值“存储”在这个变量上。

2.2.1基本类型和引用类型

在上一小节,我们介绍了JavaScript中的数据类型,其中基本类型如数字,布尔值,它们在内存中都有固定的大小,我们通过变量来直接访问基本类型的数据。而对于引用类型,如对象,数组和函数,由于它们的大小在原则上是不受任何限制的,故我们通过对其引用的访问来访问它们本身,引用本身是一个地址,即指向真实存储复杂对象的位置。

基本类型和引用类型的区别是比较明显的,我们来看几个例子:

  1. <strong>var x = 1;//数字x,基本类型  
  2. var y = x;//数字y,基本类型  
  3. print(x);  
  4. print(y);  
  5.    
  6. x = 2;//修改x的值  
  7.    
  8. print(x);//x的值变为2  
  9. print(y);//y的值不会变化</strong> 

运行结果如下:

1

1

2

1

这样的运行结果应该在你的意料之内,没有什么特别之处,我们再来看看引用类型的例子,由于数组的长度非固定,可以动态增删,因此数组为引用类型:

  1. <strong>var array = [1,2,3,4,5];  
  2. var arrayRef = array;  
  3.    
  4. array.push(6);  
  5. print(arrayRef);</strong> 

引用指向的是地址,也就是说,引用不会指向引用本身,而是指向该引用所对应的实际对象。因此通过修改array指向的数组,则arrayRef指向的是同一个对象,因此运行效果如下:

1,2,3,4,5,6

2.2.2变量的作用域

变量被定义的区域即为其作用域,全局变量具有全局作用域;局部变量,比如声明在函数内部的变量则具有局部作用域,在函数的外部是不能直接访问的。比如:

  1. <strong>var variable = "out";  
  2.    
  3. function func(){  
  4.     var variable = "in";  
  5.     print(variable);//打印”in”  
  6. }  
  7.    
  8. func();  
  9. print(variable);//打印”out”</strong> 

应该注意的是,在函数内var关键字是必须的,如果使用了变量而没有写var关键字,则默认的操作是对全局对象的,比如:

  1. <strong>var variable = "out";  
  2.    
  3. function func(){  
  4.     variable = "in";//注意此variable前没有var关键字  
  5.     print(variable);  
  6. }  
  7.    
  8. func();  
  9. print(variable);//全局的变量variable被修改</strong> 

由于函数func中使用variable而没有关键字var,则默认是对全局对象variable属性做的操作(修改variable的值为in),因此此段代码会打印:

in

in

精彩图集

赞助商链接