switch 语句
switch
语句允许一个程序求一个表达式的值并且尝试去匹配表达式的值到一个 case
标签。如果匹配成功,这个程序执行相关的语句。
语法
switch (expression) { case value_1: statements_1 [break;] case value_2: statements_2 [break;] ... default: statements_def [break;] }
工作原理:首先设置表达式 expression
(通常是一个变量)。随后表达式的值会与结构中的每个 case
的值做比较。如果存在匹配,则与该 case
关联的代码块会被执行。请使用 break
来阻止代码自动地向下一个 case
运行。
参数
参数 | 说明 |
---|---|
expression | 用于比较的表达式 |
value_(n) | 与 expression 比较的值 |
statement(n) | 执行语句 |
关键词
case
:表示一种情况,如果expression
等于value
,就执行statement
break
:会使代码跳出switch
语句,如果没有关键词break
,代码执行就会继续进入下一个case
。default
:说明了表达式的结果不等于任何一种情况时的操作(事实上,它相对于 else 从句)。
示例
var myCar = 'Porsche' switch (myCar) { case 'Nissan': alert("My car is Nissan"); break; case 'Honda': alert("My car is Honda"); break; case 'Porsche': alert("My car is Porsche"); break; default: alert("I have no car"); }
return 语句
函数中的 return
语句用来返回函数调用后的返回值
语法
return expression;
说明
返回语句特点
return
语句只能出现在函数体内,如果不是会报语法错误
return 1; // SyntaxError: Illegal return statement
- 由于 JavaScript 可以自动插入分号,因此在
return
关键字和它后面的表达式之间不能有换行。
var test = function fn(){ return 2; }; console.log(test()); // undefined
- 一个函数中可以有多个
return
语句。
function diff(iNum1, iNum2) { if (iNum1 > iNum2) { return iNum1 - iNum2; } else { return iNum2 - iNum1; } }
函数进程
- 如果没有
return
语句,则函数调用仅仅依次执行函数体内的每一条语句直到函数结束,最后返回调用程序。这种情况下,调用表达式的结果是undefined
。
var test = function fn(){} console.log(test()); // undefined
- 当执行到
return
语句时,函数终止执行,并返回 expression 的值给调用程序
var test = function fn(){ return 2; }; console.log(test()); // 2
return
语句经常作为函数内的最后一条语句出现,这是因为return
语句可用来使函数提前返回。当return
被执行时,函数立即返回而不再执行余下的语句
//并没有弹出1 var test = function fn(){ return; alert(1); }; console.log(test());//undefined
- 并不是函数中
return
语句后的所有语句都不执行,finally
语句是例外,return
语句不会阻止finally
子句的执行。
function testFinnally(){ try{ return 2; }catch(error){ return 1; }finally{ return 0; } } testFinnally(); // 0
返回值
- 如果函数调用时在前面加上了
new
前缀,且返回值不是一个对象,则返回this
(该新对象)
function fn(){ this.a = 2; return 1; } var test = new fn(); console.log(test); // {a:2} console.log(test.constructor); // fn(){this.a = 2;return 1;}
- 如果返回值是一个对象,则返回该对象。
function fn(){ this.a = 2; return {a:1}; } var test = new fn(); console.log(test);//{a:1} console.log(test.constructor);//Object() { [native code] }
return
语句可以单独使用而不必带有表达式expression
,这样的话也会向调用程序返回undefined
。
var test = function fn(){ return; }; console.log(test()); // undefined
总结
return
语句只能出现在函数体内return
关键词和表达式之间不可换行- 一个函数中可以有多个
return
语句 - 当执行
return
语句,函数终止执行,并返回表达式 return
语句不会阻止finally
子句的执行- 调用构造函数,且返回值不是一个对象,则返回该新对象
- 如果返回值是一个对象,则返回该对象
return
语句可单独使用而不必带有表达式,返回undefined
if 语句
条件语句用于基于不同的条件来执行不同的动作。
在 JavaScript 中,我们可使用以下条件语句:
- if 语句 - 只有当指定条件为
true
时,使用该语句来执行代码 - if…else 语句 - 当条件为
true
时执行代码,当条件为false
时执行其他代码 - if…else if…else 语句 - 使用该语句来选择多个代码块之一来执行
- switch 语句 - 使用该语句来选择多个代码块之一来执行
当一个逻辑条件为真,用 if
语句执行一个语句。当这个条件为假,使用可选择的 else
从句来执行这个语句。
单层条件判断
if (condition) { statement_1; } [else { statement_2; }] //推荐使用严格的语句块模式,语句else可选
参数 | 说明 |
---|---|
condition | 为任何返回结果(若非 boolean 类型会被 ECMAScrpt 转换)为 true 或 false 的表达式。如果条件式为 true ,statement1 会被执行;否则 statement2 会被执行 |
statement1(2) | 为任意语句(代码块),甚至可以将另一个 if 语句嵌套七种 |
多层条件判断
if (condition_1) { statement_1; } [else if (condition_2) { statement_2; }] ... [else if (condition_n_1) { statement_n_1; }] [else { statement_n; }]
要执行多个语句,可以使用语句块 ({ … }) 来分组这些语句。
示例
不建议在条件表达式中
不建议在条件表达式中使用赋值操作,因为在快速查阅代码时容易看成等值比较。
请勿使用以下代码:
if ((x = y)) { // do something }
如果你需要在表达式中使用赋值,通常在赋值语句前后额外添加一对括号。
if ((x = y)) { // do something }
假值等效值
下面这些值将被计算出 false
:
false
undefined
null
0
NaN
""
当传递给条件语句时,所有其他值,包括所有对象会被计算为真。
请不要混淆原始的布尔值 true
和 false
与 Boolean
对象的真和假。
var b = new Boolean(false); if (b) // this condition evaluates to true if (b == true) // this condition evaluates to false
for 语句
for 语句 也是一种前测试循环语句,但它具有在执行循环之前初始化变量和定义循环后要执行的代码的能力。
语法
for (initialization; expression; post - loop - expression) { // statement }
参数:
initialization
初始化表达式:表达式通常会初始化一个或多个循环计数器(变量),但语法上是允许一个任意复杂度的表达式,通常为一条声明赋值语句(只在循环开始之前执行一次)。expression
循环条件判断:执行循环语句前的判断语句(通常为比较表达式),若为true
则执行循环语句,否则则不执行循环语句,并跳出循环语句。post-loop-expression
计数器变量更新:循环执行语句执行后执行的计数器变量更新表达式,更新循环计数器(变量),以进入下一次循环条件判断。statement
循环执行语句:当循环条件满足时所执行的语句,执行完毕后执行计数器变量更新语句(利用break
、continue
语句除外)。
最佳实践
代码示例
var count = 10; for (let i = 0; i < count; i++) { console.log(i); }
从尾部向前循环
位数的整倍循环
// 五位数的数字 const num = 99999; for (let i = 1; i < num; i *= 10) { // 被除数 num // 除数 const divisor = i * 10; // 整除部分 const divided = Math.floor(num / divisor); // 余数 const remainder = num % divisor; console.log(i, divisor); // i divisor // 1. 1 10 // 2. 10 100 // 3. 100 1000 // 4. 1000 10000 // 5. 10000 100000 }
涉及多个变量的循环
for (let i = 0, j = 10; i < 10; i++, j--) { sum += i * j; }
若在循环中一次迭代改变多个变量,则必须使用到逗号运算符,它将初始化表达式和自增表达式合并入一个表达式中以用于 for
循环。
可忽略的表达式
function tail(o) { // 返回链表的最后一个节点对象 for (; o.next; o = o.netx /* empty */); return; // 根据判断 o.next 是不是真值来执行遍历 }
循环计数器(变量)中一般都是数字,也是最常用的,但不是必需的。for
循环中的三个表达式中的任何一个都可以忽略,但是两个分号必不可少。如果 expression
,那么这将是一个死循环,同样,和 while(true)
类似,死循环的另一种写法是 for(;;)
。