你的位置:首页 > Java教程

[Java教程]JavaScript基本概念(五)


语句:

       与java一样,在javascript中也是有语句存在的,并且功能与java中也基本一致,只有某些地方可能会有些差距。

1.if语句

判断语句,如果条件为真时,则执行代码块中的内容,java中不同的是,这里的条件不一定是布尔型的,此时ECMAScript自动调用Boolean()函数将条件转换为布尔型

2.do-while语句和while语句

用法和java一样,两者可以互相转换,do-while的结果至少执行一次。

3.for语句和for-in语句

for语句对于循环遍历用的还是比较多的,但是有一点需要注意,如下所示:

 

定义的变量i在for循环结束之后还是有效的,并没有销毁,因此在一个脚本中存在多个for循环时需要注意。

for-in迭代语句可以用来枚举对象的属性,看下面的例子:

 

上面的例子可以看出,for-in循环不仅可以遍历对象中的属性,而且可以遍历数组中的元素,注意:1.在遍历对象的属性时,由于ECMAScript对象的属性没有顺序,因此,通过for-in循环输出的属性名的顺序也是不可预测的,也就是说对象中的所有属性都会被返回一次,但是返回的顺序是不一样的,因浏览器而异。2.ECMAScript5中,对于对象的变量值是null或者undefined的,使用for-in语句时不再执行循环体,但是在ECMAScript5之前,对于undefined和null使用for-in语句会报错。

4.label、break和continue语句

label语句可以在代码中添加标签,以便后来使用,一般是和break或者continue结合使用,break和continue语句用语在循环中精确的控制代码的执行。其中break语句会立即退出循环,强制执行循环后面的语句。而continue语句虽然也是立即退出循环,但是退出后会从循环的顶部继续执行。在存在循环嵌套的情况时,可以将label和break或者continue联合使用,从而返回代码中的特定的位置。

5.with语句

with语句的作用是将当前的代码的作用域绑定到一个特定的对象中,看下面的例子:

 

访问对象obj中的属性时,可以采用对象打点加上属性名的方式访问,如果这个对象下的属性太多,并且要一次取出来就可以使用with语句,使用with语句后就不用重复指定参考对象,在with语句中,凡是javascript不能识别的属性和方法都和该语句块指定的对象有关。

6.switch语句

javascript中的switch语句可以使用任何数据类型,无论是字符串还是对象都没有问题,其次,每个case的值也不一定是常量,可以是变量也可以是表达式。

函数

Javascript中的函数使用function关键字来声明,后跟一组参数以及函数体。函数的调用方式为函数名后跟圆括号,有参数的话,参数放在圆括号中,以逗号隔开。

函数的特点:1.不必指定是否有返回值。因为在任何时候都可以通过return语句后跟要返回的值来实现返回值,函数在执行完return语句之后会停止并且立即退出,因此return语句之后的代码永远不会再执行。2.return语句后面也可以不带任何返回值,此时函数停止执行后返回undefined,用于需要提前停止函数执行而不需要返回值的情况。

严格模式下对函数的限制如下:1.不能把函数命名为eval或者arguments;2.不能把参数命名为eval或者arguments;3.不能出现两个命名参数同名的情况。出现上述情况会导致语法错误。

1.参数

Javascript中函数对于参数的传入没有严格的限制,首先,参数的个数不限制,可以传0到多个,其次,参数的类型不限制,可以传递任意类型的值。出现上述结果的原因是javascript中的函数的参数的内部是一个数组,函数接收到的始终是这个数组,而不会去关心数组中的元素有哪些。在函数体中可以使用arguments对象来访问这个参数数组,从而获取数组中存储的参数的值。

arguments对象和数组类似,可以使用[下标值]的方式访问其中的值,下标从0开始,下面所示的函数中的写法是等价的:

 

       上述的例子说明在javascript函数中,命名的参数只是为了提供便利,但是不是必须的。

此外在javascript中,解析器不会验证命名参数,因此也就不需要像java中一样,需要实现创建一个函数签名,在调用时必须和创建的签名一样。

       可以通过arguments的length属性获取参数的个数,此外,在函数体中命名参数和arguments是可以同时使用的,如下所示:

 

关于arguments还有一点需要注意,那就是arguments的值永远和对应命名参数的值保持同步,请看下面例子:

 

上面例子可以看出,改变了arguments[1]的值以后,num2的值也发生了改变。这并不是说着两个值的存储空间是一样的,他们还是独立的存储空间,但是他们的值是同步的

此外,如果函数只传入了一个值,那么此时为arguments[1]赋值是不会反映到命名参数上的,因为arguments的长度是由传入的参数个数决定的,而不是由定义函数时参数的个数决定的。另外,没有传递值的命名参数将自动赋值为undefined。

       在严格模式下,对arguments对象做了一些限制,首先,像arguments[1] = 20这种赋值会无效,如果只传递一个参数,那么即使把arguments[1]赋值为20,num2还是undefined,还是上面的例子,在严格模式下的执行效果如下所示:

       最后,在javascript中,所有的参数传递都是值传递,不可能通过引用传递参数。

 

2.重载

在java中可以为一个函数编写两个定义,只要这两个定义的函数签名不一样,那么就可以实现方法的重载,但是在javascript中没有函数签名,因此不能实现传统意义上的重载,如果出现了两个函数名称相同的函数,那么后面定义的函数会覆盖前面定义的函数。

  基本概念部分结束,下一部分为变量、作用域和内存问题。