语句块
- 所谓语句块, 便是由一对花括号括起来的一条或多条语句 ```javascript { x++; }
{ let y=11; y++; console.log(‘y=’, y) }
- 此处可以联想一下变量作用域的内容<a name="xUJ7i"></a># 条件判断语句- 其意为根据指定条件所对应的结果, 来执行对应的语句- JavaScript中支持两种, if...else/switch<a name="HbqrH"></a>## if...else语句- 当一个逻辑条件为真, 用if语句执行一个语句. 当这个条件为假, 使用可选择的 else 从句来执行这个语句 --MDN```javascriptif(condition) { // 括号内为条件表达式statement_1; // condition 判断为真时执行} else {statement_2; // condition 判断为假时执行}
当然, 也可以嵌套使用
if(condition_1) {statement_1;} else {if(condition_2) {statement_2;} else {statement_3;}}
上面等同于, 下面这样写更容易阅读一点
if(condition_1) {statement_1;} else if(condition_2) {statement_2;} else {statement_3;}
不建议在条件表达式中使用赋值 ```javascript if(x=y) {;}
if((x=y)) {;} // 如果一定要的话, 通常在赋值语句前后加一对括号
<a name="eQ4jO"></a>## 一些在if判断中会被判断为假的值- false- undefined- null- 0- NaN- 空字符串("")- 其他值统统为真- **请不要混淆原始的布尔值true和false 与 Boolean对象的真和假**. 例如:```javascriptvar b = new Boolean(false);console.log(typeof(b)) // objectif (b) //结果视为真, 此时的b是一个Boolean对象, 并非以上的值if (b == true) // 结果视为假, 当进行比较时, 应该是 b.value == true 这种情况
switch语句
switch语句允许一个程序求一个表达式的值, 并通过该值去匹配对应 case 标签, 然后执行对应语句
switch(expression) {case label_1:statement_1;[break;]case label_2:statement_2;[break;]...default:statement_def;}
switch语句开始执行的时候, 会先得出 expression 表达式的值, 根据该值从上往下匹配对应的 label 值, 然后执行 label 后面的语句, 如果匹配不到 label 值的话, 就执行 default 后面的语句, 最后结束 ```javascript function f1(num) { switch(num/10) { case 1:
console.log(`${num}/10=1`);break;
case 2:
console.log(`${num}/10=2`);break;
default:
console.log('not found number!');
} }
f1(10) // 10/10=1 f1(20) // 20/10=2 f1(‘Good’) // not found number!
- **执行的时候, 只有遇到 break; 语句才会停下来**, 也就是说如果label对应的语句没有break;, 那从该行开始执行到有break;的那一行, 比如```javascriptfunction f1(num) {switch(num/10) {case 1:console.log(`${num}/10=1`);case 2:console.log(`${num}/10=2`);break;default:console.log('not found number!');}}// case 1 和case 2 的内容会一起输出f1(10) // 10/10=1 \n 10/10=2
异常处理语句
try…catch…finally
是的, 就是这么快, 你可以使用 throw 关键字手动抛出一个异常(当然也可以瞎写代码), 然后使用 try…catch 语句捕获它, 基础形式如下:function f1() {try{// 可能出现问题的代码块// 或是手动抛出错误 throw Err} catch(catchID) {// 错误出现后应该执行的代码块} finally {// 捕获过程结束执行的代码块, 无论错误有没有出现都会执行}}
throw 关键字能抛出任意表达式, 比如 throw (“Error”/123/true/[‘123’, ‘456’]/{name: ‘ming’})
- catchID是catch块给try块中抛出的错误指定的一个变量名, 在catch块内, 可以通过catchID来表示try块抛出的错误, 是的, catchID 是局部作用域的, 在catch块结束后就会被回收
- finally块, 根据MDN的介绍, 可以用来进行优雅的处理退出(是的, 原文), 一般都是用来关闭所打开文件的联系的(
或者是写 console.log(‘已优雅地退出异常捕获处理’)). 如果使用 finally块返回一个值, 那该值就是整个try-catch-finally流程的返回值, 无论try块和catch块中返回了什么. ```javascript function f1() { try{
return ‘function_1 success’ } catch(catchID) { return ‘function_1 found error!’ } finally { return “function_1 return 123” } }throw 'Good'
console.log(f1())
// function_1 return 123 // 注释第8行时, 结果为 function_1 found error!
- **同样, finally块返回的值也会覆盖catch块抛出的错误, 是的, finally的返回值是最霸道的. **如下:```javascriptfunction f1() {try{throw 'Good'} catch(catchID) {throw catchID} finally {return "function_1 return 123"}}// 这种就是嵌套 try...catch 语句try{console.log(f1())} catch(err) {console.log("function_1 throw error!")}// function_1 return 123// 注释第7行时, 结果为 function_1 throw error!
- 一个错误只能被一个catch块捕获, 在异常处理流程中, 如果抛出的错误没有被该次流程的catch捕获, 则会被外层流程处理, 这点在嵌套使用中很重要
```javascript
function f1() {
try{
}/* catch(err) {throw 'Good'
}*/ finally { console.log(‘function_1 flow has ended’) } }console.log('Error is caught in the inner layer')
try { f1() } catch(err) { console.log(‘Error is caught in the outer layer’) }
/ function_1 flow has ended Error is caught in the outer layer /
<a name="nzlaf"></a>## Error对象- JavaScript中内置了 Error 对象, 可以根据 errorExample.name 和 errorExample.message 可以获取更简练的消息```javascriptfunction f1() {try{x += 1;} catch(catchID) {console.log('错误类型为: '+catchID.name)console.log('错误提示为: '+catchID.message)}}f1()/*错误类型为: ReferenceError错误提示为: x is not defined*/
- 或者是应用在个人觉得有出错可能的地方, 方便更快锁定错误来源
```javascript
function f1(num=10) {
try{
} } catch(catchID) {if((typeof num)!= Number) {throw (new Error('The parameter not is Number, code rows is 4'))
} }console.log('错误类型为: '+catchID.name)console.log('错误提示为: '+catchID.message)
f1(‘Good’)
/ 错误类型为: Error 错误提示为: The parameter not is Number, code rows is 4 / ```
