JavaScript之语句

来源:互联网 发布:怎样做淘宝店铺推广 编辑:程序博客网 时间:2024/06/04 23:28

摘要

JavaScript程序无非就是一系列可执行语句的集合。

复合语句和空语句

语句块的结尾不需要分号。块中的原始语句必须以分号结束,但语句块不需要。
JavaScript中没有块级作用域,在语句块中声明的变量不是语句块私有的。

在创建一个具有空循环体的循环时,空语句有时是很有用的。
for(var i=0;i<a.length;a[i++]=0) //初始化数组

如果是有特殊摩的的需要而使用空语句,最好在代码中添加住宿,这样可以更清楚地说明这条空语句的作用。


声明语句

在普通模式下,多次声明同一个变量是无所谓的。

function的花括号是必要的,就算函数只有一条语句,也需要

函数声明语句通常出现在JavaScript代码的最顶层,也可以嵌套在其他函数题内。但是嵌套式,函数声明只能出现在所嵌套函数的顶部。也就是说,函数定义不能出现在if语句、for语句或其他任何语句中

尽管函数声明语句和函数定义表达式包含有相同的函数名,但两者仍然不同。两种方式都创建了新的函数对象,但是函数声明语句中但函数名是一个变量名,变量指向函数对象。和通过var声明变量一样,函数定义语句中的函数被显式地提前到了脚本或函数的顶部。因此它们在整个脚本或函数内都是可见的。而如果使用var的话(函数声明),只有变量声明提前——变量的初始化代码依旧停留在原位置。而函数定义则是函数名称和函数体都被提前,也就是说,可以在声明一个JavaScript函数前调用它。


条件语句

else if 语句不是真正的JavaScript语句,只不过是多条if/else语句连在一起时的一种惯用写法

当指向switch语句的时候,它首先计算expression的值,然后查找case子句中的表达式是否和expression的值相同(本处是按严格相等算的)

在switch中,case指数指明了要执行代码的起点,并没有指明终点。

如果在函数中使用switch语句,可以使用return来代替break,return和break多用来终止switch语句,也会防止一个case语句块执行完后继续指向下一个case语句块

最安全的做法是在case表达式中使用常量表达式

循环

do循环需要以分号结尾。

在执行for/in语句的过程中,JavaScript解释器首先计算object表达式,如果表达式为null或undefined,JavaScript解释器将会跳过循环器并执行后续的代码。如果表达式等于一个原始值,则会被转换为与之相对应的包装对象。

只要for/i循环中variable的值可以当作复制表达式可以当作赋值表达式的左值,它可以是任意表达式。
var o = {x:1,y:2,z:3};var a =[],i=0;for (a[i++] in o);for (i in a) console.log(a[i]);//x y z
可以看到,上述代码实际上产生的赋值,它将一个对象的属性复制到一个数组中。

实际上,for/in循环并不会便利对象所有的属性,只有”可枚举“的属性才会遍历到。
如果for/in的循环体删除来还未枚举的属性,那么该属性将不会再被枚举到。如果循环体定义来对象的新属性,这些属性通常也不会枚举到。

ES规范并没有指定for/in循环按照和中顺序来枚举对象类型,但实际上,主流的浏览器厂商都是按照属性定义的先后顺序来枚举见到对象的属性。如果是以对象直接量的形式创建对象,则将按照直接量中属性的出现顺序枚举。

除了所有非继承“自有”属性以外的继承属性都往往是可枚举的。
JavaScript的一些(并非全部)实现依照数字顺序来枚举数组类型,而不是某种特定的顺序。但当数组元素的索引是非数字或是不连续的,则按照特定顺序枚举。

break,continue是JavaScript中唯一可以使用语句标签的语句。

这里用作标签的identifier必须是一个合法的JavaScript标识符,而不能是一个保留字。标签的命名空间和变量或函数的命名空间是不同的,因此可以使用同一个标识符作为语句标签和作为变量名或函数名。

在两个代码段互不嵌套的情况下是可以出现同名的语句标签。

当循环终止掉进非常复杂时,在函数体内使用break语句实现这些条件判断要比写在循环表达式中的终止条件要简单得多。

当没有任何闭合语句块指定来break所用的标签,这时会产生一个语法错误。break可以跳出任何闭合的语句块。

不管break语句带不带标签,它都只能在循环体内使用。在其他地方使用将会报语法错误。

由于continue在着两种循环的行为表现不同,因此使用while循环不可能完美地模拟实现for循环。

return语句只能在函数体内出现,如果不是的话会报语法错误。

一个Error对象有一个name属性表示错误类型,一个message属性用来存放传递给构造函数的字符串。

catch子句中的标识符具有块级作用域,它只在catch语句块内有定义。

只要try语句中有代码执行来。finally从句就会执行。它通常在try从句的代码后用于清理工作。

由return,continue,break语句使解释器跳出语句块时,解释器在执行新的目标代码之前现执行finally的逻辑,然后向上传播这个一次,直到找到能处理这个异常的catch从句。

如果finally块使用了return、continue、break或者throw语句使程序发生跳转,或者通过调用抛出异常改变了程序执行流程,都以finally为准。

在没有catch从句的情况下try从句可以和finally从句一起使用。

就算有finally,依旧无法用while替代for

其他语句类型

严格模式下禁止使用with

只有在查找标识符的时候才会用到作用域链,创建新的变量的时候不使用。
with语句提供了读取属性的快捷方法,但不能创建属性(与全局无异)

debugger只有在调试器启动的情况下有效

"use strict"只能出现在脚本代码的开始或函数体的开始、任何实体语句之前,但不一定是首行。

严格模式下函数的this为undefined而不是全局变量
0 0