数据类型和变量

  任何语言都离不开数据类型和变量。虽然JavaScript语言是弱类型语言,但它一样支持变量声明,变量一样存在作用范围,即有局部变量和全局变量之分。下面依次介绍JavaScript中数据类型和变量的基本语法。

定义变量的方式

  JavaScript是弱类型脚本语言,使用变量之前,可以无须定义,想使用某个变量时直接使用即可。归纳起来,JavaScript支持两种方式来引入变量。
  ➢ 隐式定义:直接给变量赋值。
  ➢ 显式定义:使用var关键字定义变量。
  隐式定义的方式简单、快捷,需要使用变量时,直接给变量赋值即可。

例子
<script type="text/javascript">  
    // 隐式定义变量a
    a = "Hello JavaScript";
    // 使用警告对话框输出a的值
    alert(a);
</script>  

  显式声明方式是采用var关键字声明变量,声明时变量可以没有初始值,声明的变量数据类型是不确定的。当第一次给变量赋值时,变量的数据类型才确定下来,而且使用过程中变量的数据类型也可随意改变。

例子
<script type="text/javascript">  
    //显式声明变量a
    var a ;
    //给变量a赋值,赋值后a的数据类型为布尔型
    a = true;
    //使用警告对话框输出a的值
    alert(a);
</script>  
注意

  JavaScript中的变量是区分大小写的。因此变量abc和Abc是两个不同的变量,读者编程时一定要注意。

类型转换

  JavaScript支持自动类型转换,这种类型转换的功能非常强大。

例子
<script type="text/javascript">  
    // 定义字符串变量
    var a = "3.145";
    // 让字符串变量和数值执行算术运算
    var b = a - 2;
    // 让字符串变量和数值执行运算,到底是算术运算,还是字符串运算呢?
    var c = a + 2;
    // 输出b和c的值
    alert (b + "\n" + c);
</script>  

  在上面代码中,a是值为3.145的字符串,让a和数值执行减法,则自动执行算术运算,并将a的类型转换为数值;让a和数值执行加法,则a的值转换为字符串。这就是自动类型转换,它的转换规律是:
➢ 对于减号运算符,因为字符串不支持减法运算,所以系统自动将字符串转换成数值。
➢ 对于加号运算符,因为字符串可用加号作为连接运算符,所以系统自动将数值转换成字符串,并将两个字符串进行连接运算。
  各种类型自动类型转换的结果如下图所示。


IT料理

  这种自动类型转换虽然方便,但程序可读性非常差,而且有时候我们就是希望让字符串和数值执行加法运算,这就需要使用强制类型转换了。 JavaScript提供了如下几个函数来执行强制类型转换。
  ➢ toString():将布尔值、数值等转换成字符串。
  ➢ parseInt():将字符串、布尔值等转换成整数。
  ➢ parseFloat():将字符串、布尔值等转换成浮点数。

变量

  变量是程序设计语言里最重要、最基本的概念。与强类型语言不同的是,JavaScript是弱类型语言,同一个变量可以一会儿存储数值,一会儿存储字符串。正如前面所讲的,变量声明有两种方式,即显式声明和隐式声明。变量还有个重要的概念:作用范围。
  根据变量定义的范围不同,变量有全局变量和局部变量之分。直接定义的变量是全局变量,全局变量可以被所有的脚本访问;在函数里定义的变量称为局部变量,局部变量只在函数内有效。如果全局变量和局部变量使用相同的变量名,则局部变量将覆盖全局变量。
  代码的执行结果是“局部变量”,代码中定义了名为test的全局变量,但在函数中又定义了名为test的局部变量,函数中的局部变量覆盖了全局变量。与Java、C等语言不同的是,JavaScript的变量没有块范围,看如下代码。

例子
<script type="text/javascript">  
    function test(o)
    {
        // 定义变量i,变量i的作用范围是整个函数
        var i = 0;
        if (typeof o == "object") 
        {
            // 定义变量j,变量j的作用范围是整个函数内,而不仅仅是在if块内。
            var j = 5;
            for(var k = 0; k < 10; k++)
            {
                // 因为JavaScript没有代码块范围
                // 所以k的作用范围是整个函数内,而不是循环体内
                document.write(k);
            }
        }
        // 即使出了循环体,k的值依然存在
        alert(k + "\n" + j); 
    }
    test(document);
</script>  

  在很多JavaScript编程人员的印象中,定义变量用var和不用var没有区别。但实际上是存在差异的:
  ➢ 如果使用var定义变量,那么程序会强制定义一个新变量。
  ➢ 如果没有使用var定义变量,系统会优先在当前上下文中搜索是否存在该变量。只有在该变量不存在的前提下,系统才会重新定义一个新变量。

注:本博客内容节选自李刚编著的疯狂HTML 5/CSS 3/JavaScript讲义 ,详细内容请参阅书籍。