定义变量的方式
JavaScript 是弱类型脚本语言, 使用变量之前,可以无须定义,想使用某个变量时直接使用即可。 归纳起来, JavaScript 支待两种方式来引入变量。
●隐式定义: 直接给变量赋值。
●显式定义: 使用 var 关键字定义变量。
隐式定义的方式简单、快捷, 需要使用变量时, 直接给变量赋值即可。看下面代码。
<script type="text/javacript">
//隐式定义变量 a
a = "Hello JavaScript";
//使用警告框输出 a 的值
alert (a);
</script>
显式声明变量
<script type="text/javascript''>
//显式声明变量 a
var a ;
//给变量 a 赋值,赋值后 a 的数据类型为布尔型
a= true;
//使用警告框输出 a 的值
alert(a) ;
</script>
**注:**JavaScript 中的变量是区分大小写的。因此变量 abc 和 Abc是两个不同的变量,编程时一定要注意。
与其他编程语言类似的是, JavaScript 也允许一次定义多个变量,代码如下:
//一次定义了 a 、 b 、 c 三个变量
var a , b , c;
还可以在定义变量时为变量指定初始值,例如如下代码:
//定义变址 i 、 j 、 k , 其中 J 、 K 指定初始值
var i , j = 0, k = 0;
类型转换
<script type=" text/javacript " >
//定义字符串变量
var a= "3.145";
//让字符串变量和数值执行算术运算
var b = a - 2;
//让字符串变量和数值执行加法运算,到底是算术运算还是字符串运算呢
var c =a+ 2 ;
//输出 b 和 C 的值
alert (b + " \n" + c) ;
</script>
会输出b=1.145 c=3.1452
●对于减号运算符,因为字符串不支持减法运算,所以系统自动将字符串转换成数值。
●对于加号运算符,因为字符串可用加号作为连接运算符,所以系统自动将数值转换成字符串,并将两个字符串进行连接运算。
这种自动类型转换虽然方便,但程序可读性非常差,而且有时候我们就是希望让字符串和数值执行加法运算,这就需要使用强制类型转换了。 JavaScript 提供了如下几个函数来执行强制类型转换。
- toString ( ): 将布尔值、数值等转换成字符串。
- parselnt( ): 将字符串、布尔值等转换成整数。
- parse Float( ): 将字符串、布尔值等转换成浮点数。
例: 如果需要让“3.145"+2 这种表达式的结果为 5 . 145, 可以使用强制类型转换。
<script type="text/ javacript" >
//定义值为 3 . 145 的字符串变
var a= "3.145";
//直接相加,使用自动类型转换
var b =a + 2;
//使用强制类型转换
var c = parseFloat(a) + 2;
alert (b + "\n" + c);
</script>
会输出b=3.1452 c=5.145
对于3.145 这种可以正常转换成数值的字符串,可以成功转换为数值;但对于包含其他字符的字符串,将转换成 NaN 。
当使用 parseint() 或 parseFloat()将各种类型的变量转换成数值类型时,结果如下。
- 字符串值: 如果字符串是一个数值字符串,则可以转换成一个数值,否则将转换成 NaN 。
- undefined 、 null 、布尔值及其他对象: 一律转换成 NaN。
当使用 toString()函数将各种类型的值向字符串转换时,结果全部是object 。
变量作用域
变量还有个重要的概念:作用域。 根据变显定义的范围不同,变量有全局变量和局部变量之分。 在全局范围(不在函数内)定义的变量( 不管是否使用 var) 、不使用 var 定义的变量都是全局变量,全局变量可以被所有的脚本访问;在函数里定义的变量称为局部变量,局部变量只在函数内有效。
<script type= " text/ javascript " >
//定义全局变趾test
var test= “全局变量”;
//定义函数 myFun
function myFun ()
//在函数内不使用 var 定义的 age 也是全局变量
age= 20;
//在函数内使用 var 定义的 age 是局部变量
var isMale = t rue;
}
myFun ();
alert(test + "\n" + age);
alert(isMale);
</script>
在全局范围内定义的 test 和在函数范围内定义的 age, 都变成全局可用的变量。
如果全局变量和局部变量使用相同的变量名,则局部变量将覆盖全局变量。
与 Java 、C 等语言不同的是,JavaScript 的变量没有块范围:
<script type="text/javascript">
function test(o)
{
//定义变量 i, 变拉 i 的作用范围是整个函数
var i = 0;
if (typeof 0 == "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>
- 如果使用 var 定义变量,那么程序会强制定义一个新变量。
- 如果没有使用 var 定义变量,系统将总是把该变量当成全局变量——不管前面是否曾定义过该全局变量。如果前面已定义了同名的全局变批,此时就是对已有的全局变皂赋值;如果前面没定义过同名的全局变僵(在函数范围内也没定义过同名 的局部变量),此时就是定义一个全新的全局变量。
全局变量的作用范围对于执行 HTML 事件处理一样有效。
变量提升
所谓变量提升,指的是变量声明总是会被解释器“提升”到函数体的顶部
<script type="text/javascript">
//定义全局变量
var scope = "全局变量";
function test()
{
document.writeln(scope + "<br>");
//定义scope局部变量,其作用范围为整个函数内
var scope = "局部变量";
//再次输出scope的值
document.writeln(scope + "<br>");
}
test();
</script>
**注:**变量提升只是提升变量声明部分,并不会提升变量赋值部分。
因此 上面的 test()函数实际上等 同于如下形式:
function t est ()
{
var scope;
document.writeln(scope + "<br >" );
//定义 scope 局部变量,其作用范围为整个函数内
scope= "局部变量";
//再次输出 scope 的值
document.writeln(scope + "<br >");
}
JavaScript 变量提升甚至不需要定义变量的语句真正执行,只要 函数中包括了定义变量的语句,该变量声明就会被提升到函数体的顶部。
新增的 let 变量
使用 var 定义变量可能存在如下问题:
- var 定义的变量没有块作用域。
- var 定义的全局变量会自动添加全局 window 对象的属性。
- var 定义的变量会提前装载。
let 关键字正是为了解决上述问题而出现的。先看如下示例使用 let 来定义循环变量。
<script type= " text/javascript " >
for (let i = 0; i < 10 ; i++)
{
console.log(i) ;
}
//报错: Uncaught ReferenceError: i is not defined
console . log( " 循环体之外: " + i) ;
</script>
上面程序在 for 循环中使用 let 来定义循环计数器,这样该循环计数器讨各只在 for 循环中有效, 因此程序在循环体之外访问 1 变量时将会导致如上所示的错误一一如果将 for 循环中的let 改为 var, 那么在循环体中定义的 i 变量的作用域将会扩散到循环体之外。
使用 const 定义常量
const 也是一个新增的关键字,JavaScript 允许使用该关键字定义常量。与 var 、let 不同的是,使用 const 定义的常量只能在定义时指定初始值(且必须指定初始值)。使用 const 声明常量以后不允许改变常量值。
如下代码示范了const 的用法。
const MAX_AGE = 120;//正确
MAX_AGE = 200;//语法错误
MAX_AGE++;//自加可以改变MAX_AGE的值,因此也会导致错误
使用 const 定义的常量必须在定义的同时指定初始值,否则将会导致错误。例如如下代码
const MAX_AGE ; //const常量没指定初始值,错误