数据类型和变量
任何语言都离不开数据类型和变量。虽然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的值转换为字符串。这就是自动类型转换,它的转换规律是:
➢ 对于减号运算符,因为字符串不支持减法运算,所以系统自动将字符串转换成数值。
➢ 对于加号运算符,因为字符串可用加号作为连接运算符,所以系统自动将数值转换成字符串,并将两个字符串进行连接运算。
各种类型自动类型转换的结果如下图所示。
这种自动类型转换虽然方便,但程序可读性非常差,而且有时候我们就是希望让字符串和数值执行加法运算,这就需要使用强制类型转换了。 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讲义 ,详细内容请参阅书籍。