JavaScript 常见语句类型

266 阅读5分钟

在 JavaScript 中,语句可以采用单行形式,也可以使用一对大括号 {} 括起来的复合语句。语句之间通过语法符号(分号)进行分隔,同时某些语句也具有返回值。

常见的语句类型包括声明语句、表达式语句、分支语句、循环语句、控制结构以及其他类型的语句。了解这些语句类型对于编写高质量的 JavaScript 代码非常重要。

表达式语句

什么是表达式?表达式是由一系列的操作符、变量、常量、函数调用,组成的代码,它可以是简单的值(数字、字符串),也可以是复杂的计算式(数学运算、函数调用),它可以计算出一个值。

2;

上面的代码是单值表达式,因为 2 是一个单值,所以它是一个单值表达式。

str = 'test string';

详细解释一下:

  • str是左操作数;
  • =号是运算符;
  • ‘test string’是右操作数;
  • ;号是语句结束符;

上面的代码是赋值表达式。

3 + 4    // 返回 7
"Hello" + " " + "World"   // 返回 "Hello World"
(5 * 10) / 2    // 返回 25
Math.pow(2, 3)   // 返回 8

函数调用语句

JavaScript 中的函数本身就是一个变量/值,因此函数调用其实是一个表达式:

fn();

它也是一个表达式语句。

变量声明语句

纯粹的变量声明语句只是声明变量,并不赋值:

let abc;

但一般情况下,我们使用显示声明时,会同时赋值:

let abc = 'string'

在引擎层面,JavaScript 是将上面的语句分为「变量声明、赋值语句」,两个不同的阶段去处理。

其中,let abc 作为变量声明,在语法解析阶段就被处理,执行环境中有了 abc 的变量名,而 abc = ‘string’ 在执行阶段处理,通过赋值操作向变量名 abc 绑定具体的值。

在JavaScript 中,所有显示声明的数据都是按这种处理方式实现的,包括 let、var、const、函数声明等。

for (var prop in obj){
	//...
}

上面代码中 var 声明的变量作用域是在函数一级,不是当前的{}语句块哈,像使用:

var prop;
for (prop in obj){}

上面两个 for 循环的声明语句,没有区别。

如果使用 let 或者 const 声明的话,变量声明是在当前语句的块级作用域中:

for (let prop in obj){
	//prop 的作用域范围
}

分支语句

if (condition)
	statement1
[else
	statement2];

当 condition 语句成立时,执行 statement1,否则执行 statement2。

当没有 else 语句时,则 condition 条件不成立时,什么也不做。

对于 if … else if … 语句来说,这样的格式是一种语法的变种,只不过 else 是子句中的 statement2 是一个新的、单行的 id 语句而已。

if (condition1){
	//执行
} else if(){
	//执行
}

相当于:

if(condition1){
	//执行
} else {
	if (condition2) {
		//执行
	}
}

循环语句

for 循环

for (var i=10; i<10; console.log(i), i--)

while 循环

while (true) ...

do…while循环

do ... while (true);

流程控制「子句」

break 子句

默认作用于循环语句的最内层或者整个 switch 语句,因此它不必特别指定中断语句的范围。

如果在 for、while 等循环中使用 break,那么这表明停止一个最内层的循环,而将 break 用在 switch 语句中的话,则表明跳出 switch 语句。

continue 子句

它只对循环语句有意义,它只能作用于 for、while、do…while语句中,它表示停止这一次的循环,并跳转到下一次循环迭代开始处运行。

可以使用 continue 语句尽早清理掉一些分支。

return 子句

它只能作用在一个函数内,一个函数内允许出现多个 return 子句,当函数被调用时,代码执行到第一个 return 子句,并返回它指定的值,如果没有指定返回的值,那该函数返回 undefined。

如果函数执行到最后都没有 return 子句,函数执行到最后一行语句后,会返回 undefined 值。

流程控制「异常」

「异常」是与上面「子句」相反的逻辑。

一般子句用于语句块的内部,并且是开发人员可预知的、可控制的逻辑,而异常用于一个语句块的全局,处理不可预知的、不可控制的逻辑。

异常处理的语法结构如下:

try {
	//...
}
catch [(exception)]{
	//...
}
finally {
	//...
}

这个处理机制被分为三个部分:

  • 触发异常:使用 throw 语句可以在任何位置触发异常,由引擎内部在执行过程中触发异常;
  • 捕获异常:使用 try…catch 语句捕获一块代码可能发生的异常,并使用变量 exception 来指向异常的引用;
  • 结束处理:使用 try…finally 可以无视指定代码块中发生的异常,确保 finally 语句块中的代码总是被执行;

在上面的逻辑中,catch(){…} 和 finally{…} 都是可选的,但至少存在一个,finally 语句块的重点是它总是在 try/catch 退出之前执行,如果在catch或finally 块处理的时候又发生的异常,那么这个异常会被抛出到更外一层的 try…catch/finally 语句中处理。

对于开发人员来说,在使用 finally 代码块时,应该确保其中的语句可以完全且无异常地执行。如果无法确信代码中是否存在异常情况,那么应该将可能出现问题的代码移至 try 块中进行处理,以便更好地保证代码的可靠性和健壮性。

题图由 DeepAI 生成

内容来源于《JavaScript 语言精髓与编程实战》