语句块

  • 所谓语句块, 便是由一对花括号括起来的一条或多条语句 ```javascript { x++; }

{ let y=11; y++; console.log(‘y=’, y) }

  1. - 此处可以联想一下变量作用域的内容
  2. <a name="xUJ7i"></a>
  3. # 条件判断语句
  4. - 其意为根据指定条件所对应的结果, 来执行对应的语句
  5. - JavaScript中支持两种, if...else/switch
  6. <a name="HbqrH"></a>
  7. ## if...else语句
  8. - 当一个逻辑条件为真, if语句执行一个语句. 当这个条件为假, 使用可选择的 else 从句来执行这个语句 --MDN
  9. ```javascript
  10. if(condition) { // 括号内为条件表达式
  11. statement_1; // condition 判断为真时执行
  12. } else {
  13. statement_2; // condition 判断为假时执行
  14. }
  • 当然, 也可以嵌套使用

    1. if(condition_1) {
    2. statement_1;
    3. } else {
    4. if(condition_2) {
    5. statement_2;
    6. } else {
    7. statement_3;
    8. }
    9. }
  • 上面等同于, 下面这样写更容易阅读一点

    1. if(condition_1) {
    2. statement_1;
    3. } else if(condition_2) {
    4. statement_2;
    5. } else {
    6. statement_3;
    7. }
  • 不建议在条件表达式中使用赋值 ```javascript if(x=y) {;}

if((x=y)) {;} // 如果一定要的话, 通常在赋值语句前后加一对括号

  1. <a name="eQ4jO"></a>
  2. ## 一些在if判断中会被判断为假的值
  3. - false
  4. - undefined
  5. - null
  6. - 0
  7. - NaN
  8. - 空字符串("")
  9. - 其他值统统为真
  10. - **请不要混淆原始的布尔值true和false 与 Boolean对象的真和假**. 例如:
  11. ```javascript
  12. var b = new Boolean(false);
  13. console.log(typeof(b)) // object
  14. if (b) //结果视为真, 此时的b是一个Boolean对象, 并非以上的值
  15. if (b == true) // 结果视为假, 当进行比较时, 应该是 b.value == true 这种情况

switch语句

  • switch语句允许一个程序求一个表达式的值, 并通过该值去匹配对应 case 标签, 然后执行对应语句

    1. switch(expression) {
    2. case label_1:
    3. statement_1;
    4. [break;]
    5. case label_2:
    6. statement_2;
    7. [break;]
    8. ...
    9. default:
    10. statement_def;
    11. }
  • switch语句开始执行的时候, 会先得出 expression 表达式的值, 根据该值从上往下匹配对应的 label 值, 然后执行 label 后面的语句, 如果匹配不到 label 值的话, 就执行 default 后面的语句, 最后结束 ```javascript function f1(num) { switch(num/10) { case 1:

    1. console.log(`${num}/10=1`);
    2. break;

    case 2:

    1. console.log(`${num}/10=2`);
    2. break;

    default:

    1. console.log('not found number!');

    } }

f1(10) // 10/10=1 f1(20) // 20/10=2 f1(‘Good’) // not found number!

  1. - **执行的时候, 只有遇到 break; 语句才会停下来**, 也就是说如果label对应的语句没有break;, 那从该行开始执行到有break;的那一行, 比如
  2. ```javascript
  3. function f1(num) {
  4. switch(num/10) {
  5. case 1:
  6. console.log(`${num}/10=1`);
  7. case 2:
  8. console.log(`${num}/10=2`);
  9. break;
  10. default:
  11. console.log('not found number!');
  12. }
  13. }
  14. // case 1 和case 2 的内容会一起输出
  15. f1(10) // 10/10=1 \n 10/10=2

异常处理语句

try…catch…finally

  • 是的, 就是这么快, 你可以使用 throw 关键字手动抛出一个异常(当然也可以瞎写代码), 然后使用 try…catch 语句捕获它, 基础形式如下:

    1. function f1() {
    2. try{
    3. // 可能出现问题的代码块
    4. // 或是手动抛出错误 throw Err
    5. } catch(catchID) {
    6. // 错误出现后应该执行的代码块
    7. } finally {
    8. // 捕获过程结束执行的代码块, 无论错误有没有出现都会执行
    9. }
    10. }
  • 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{
    1. throw 'Good'
    return ‘function_1 success’ } catch(catchID) { return ‘function_1 found error!’ } finally { return “function_1 return 123” } }

console.log(f1())

// function_1 return 123 // 注释第8行时, 结果为 function_1 found error!

  1. - **同样, finally块返回的值也会覆盖catch块抛出的错误, 是的, finally的返回值是最霸道的. **如下:
  2. ```javascript
  3. function f1() {
  4. try{
  5. throw 'Good'
  6. } catch(catchID) {
  7. throw catchID
  8. } finally {
  9. return "function_1 return 123"
  10. }
  11. }
  12. // 这种就是嵌套 try...catch 语句
  13. try{
  14. console.log(f1())
  15. } catch(err) {
  16. console.log("function_1 throw error!")
  17. }
  18. // function_1 return 123
  19. // 注释第7行时, 结果为 function_1 throw error!
  • 一个错误只能被一个catch块捕获, 在异常处理流程中, 如果抛出的错误没有被该次流程的catch捕获, 则会被外层流程处理, 这点在嵌套使用中很重要 ```javascript function f1() { try{
    1. throw 'Good'
    }/* catch(err) {
    1. console.log('Error is caught in the inner layer')
    }*/ finally { console.log(‘function_1 flow has ended’) } }

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 /

  1. <a name="nzlaf"></a>
  2. ## Error对象
  3. - JavaScript中内置了 Error 对象, 可以根据 errorExample.name 和 errorExample.message 可以获取更简练的消息
  4. ```javascript
  5. function f1() {
  6. try{
  7. x += 1;
  8. } catch(catchID) {
  9. console.log('错误类型为: '+catchID.name)
  10. console.log('错误提示为: '+catchID.message)
  11. }
  12. }
  13. f1()
  14. /*
  15. 错误类型为: ReferenceError
  16. 错误提示为: x is not defined
  17. */
  • 或者是应用在个人觉得有出错可能的地方, 方便更快锁定错误来源 ```javascript function f1(num=10) { try{
    1. if((typeof num)!= Number) {
    2. throw (new Error('The parameter not is Number, code rows is 4'))
    } } catch(catchID) {
    1. console.log('错误类型为: '+catchID.name)
    2. console.log('错误提示为: '+catchID.message)
    } }

f1(‘Good’)

/ 错误类型为: Error 错误提示为: The parameter not is Number, code rows is 4 / ```