数据类型和变量

定义变量的方式

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常量没指定初始值,错误
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值