一、形参赋值默认值

1.1、ES6形参赋值默认值

在传递实参值时,可以用undefined来进行占位

  1. // 初始化参数-默认值
  2. // ES6形参赋值默认值
  3. function test(a = 1, b = 2){
  4. console.log(a, b);
  5. }
  6. test();
  7. // 在传递实参值的时候,可以用undefined来进行占位
  8. function func1(a = 1, b){
  9. console.log(a, b);
  10. }
  11. func1(undefined, 10)

1.2、ES5形参赋值默认值

利用实参集合和或运算的特点进行形参赋值默认值

  1. // ES5形参赋值默认值
  2. // 利用实参集合和或运算的特点
  3. function func(a, b){
  4. var a = arguments[0] || 1;
  5. var b = arguments[1] || 2;
  6. return a + b;
  7. }
  8. console.log(func());

利用typeof的特点来进行形参赋值默认值

  1. // ES5形参赋值默认值
  2. // 利用实参集合和typeof的特点以及三目运算符来实现形参赋值默认值
  3. function func(a, b){
  4. var a = typeof(arguments[0]) !== 'undefined'? arguments[0]: 1;
  5. var b = typeof(arguments[1]) !== 'undefined'? arguments[1]: 2;
  6. return a + b;
  7. }
  8. console.log(func());

二、作业「递归」

三、预编译流程

3.1、JS代码解析的过程

  • 通篇检查语法错误
  • 预编译
  • 解释一行执行一行 ```javascript

    1. // 预编译的流程
    2. // 1. 通篇检车语法错误
    3. // 2. 预编译的过程
    4. // 3. 解释一行执行一行
    5. // 函数声明整体会被提升
    6. test();
    7. function test(){
    8. console.log(1);
    9. }
    10. test();
  1. // 变量只有声明会提升,赋值不会被提升
  2. console.log(a);
  3. var a = 10;
  4. console.log(b);
  5. var b;
  6. var c;
  7. console.log(c);
  8. // 1. 先声明变量a
  9. // 2. 再把值1赋值给变量a
  10. var a = 1;
  11. function a(){
  12. var a = 10;
  13. var a = function(){}
  14. }
  15. var a = 10;
  1. <a name="aZ0bp"></a>
  2. # 四、暗示全局变量
  3. > - 暗示全局变量:imply global variable
  4. > - 在全局作用域下,写不写var都是属于暗示全局变量
  5. > - 没有声明直接赋值的,属于暗示全局变量
  6. ```javascript
  7. // 暗示全局变量:imply global variable
  8. // 在全局作用域下,写不写var都是属于暗示全局变量
  9. // 没有声明直接赋值的,属于暗示全局变量
  10. var a = 1;
  11. b = 2;
  12. console.log(a); // a = window.a
  13. console.log(window.b); // b = window.b
  14. // GO = {
  15. // a: 1,
  16. // b: 2
  17. // }

暗示全局变量:imply global variable,没有声明就直接赋值的

  1. // 暗示全局变量:没有声明就直接赋值
  2. function func(){
  3. var a = b = 1;
  4. }
  5. func();
  6. console.log(b);
  7. console.log(window.b);
  8. console.log(typeof(a));
  9. console.log(a);
  10. console.log(window.a);

五、预编译的流程

5.1、函数作用域下的预编译流程

  • 寻找形参和变量声明
  • 统一形参和实参的值
  • 寻找函数声明并赋值
  • 执行

预编译练习

  1. // 练习:预编译做过的事情,函数执行的时候就不用再去做了
  2. function func(a, b){
  3. console.log(a);
  4. c = 0;
  5. var c;
  6. a = 5;
  7. b = 6;
  8. console.log(b);
  9. function b(){}
  10. function d(){}
  11. console.log(b);
  12. console.log(a, c);
  13. }
  14. func(1);
  15. // 函数预编译流程分析
  16. // AO = {
  17. // a: undefined -> 1 -> 5
  18. // b: undefined -> function b(){} -> 6
  19. // c: undefined -> 0
  20. // d: function d(){}
  21. // }
  22. // 1
  23. // 6
  24. // 6
  25. // 5 0

5.2、全局作用域下的预编译流程

  • 寻找变量声明
  • 寻找函数声明并赋值
  • 执行
  • GO === window

    1. // 全局作用域下的预编译分析
    2. // 1. 寻找变量声明
    3. // 2. 寻找函数声明
    4. // 3. 执行
    5. // GO: global object
    6. console.log(a);
    7. var a = 1;
    8. function a(){
    9. console.log(2);
    10. }
    11. console.log(a);
    12. // 全局作用域下的预编译分析
    13. // GO = {
    14. // a: undefined -> function a(){...}
    15. // }
    16. // function a(){...}
    17. // 1
    1. // 练习
    2. console.log(a ,b);
    3. function a(){}
    4. var b = function(){}
    5. console.log(b);
    6. // 分析
    7. // GO = {
    8. // b: undefined
    9. // a: function(){}
    10. // }
    11. // function a(){} -> undefined
    12. // function(){}
    1. // 练习
    2. console.log(a);
    3. var a = 1;
    4. function a(){
    5. console.log(2);
    6. }
    7. // 分析
    8. // GO = {
    9. // a: undefined -> function a(){...}
    10. // }
    11. // function a(){....}
    1. // 练习
    2. var b = 1;
    3. function func(){
    4. var a = 1;
    5. var b = 2;
    6. console.log(a, b);
    7. }
    8. func();
    9. console.log(b);
    10. // 分析
    11. // GO = {
    12. // b: undefined -> 1
    13. // func: function func(){....}
    14. // }
    15. // AO = {
    16. // a: undefined -> 1
    17. // b: undefined -> 2
    18. // }
    19. // 1 2
    20. // 1
    1. // 练习
    2. var b = 3;
    3. console.log(a);
    4. function a(a){
    5. console.log(a);
    6. var a = 2;
    7. console.log(a);
    8. function a(){}
    9. var b = 5;
    10. console.log(b);
    11. }
    12. a();
    13. // 分析
    14. // GO = {
    15. // b: undefined -> 3
    16. // a: function a(){....大函数}
    17. // }
    18. // AO = {
    19. // a: undefined -> function a(){....小函数} -> 2
    20. // b: 5
    21. // }
    22. // function a(){....大函数}
    23. // function a(){....小函数}
    24. // 2
    25. // 5
    1. // 练习
    2. a = 1;
    3. function test(){
    4. console.log(a);
    5. a = 2;
    6. console.log(a);
    7. var a = 3;
    8. console.log(a);
    9. }
    10. test();
    11. var a;
    12. // 分析
    13. // GO = {
    14. // a: undefined -> 1
    15. // test: function test(){...}
    16. // }
    17. // AO = {
    18. // a: undefined -> 2 -> 3
    19. // }
    20. // undefined
    21. // 2
    22. // 3

    5.3、条件判断下的变量提升

    在条件判断中,不管条件是否成立都要进行变量提升;因为在预编译阶段,函数内部的代码是还没有执行的,所以是不看条件是否成立的

  1. // 条件判断下的变量提升:不管条件是否成立,都要进行变量提升
  2. function test(){
  3. console.log(b);
  4. if(a){
  5. var b = 2;
  6. }
  7. c =3;
  8. console.log(c);
  9. }
  10. var a;
  11. test();
  12. // 分析
  13. // GO = {
  14. // a: undefined
  15. // test: function test(){...}
  16. // }
  17. // AO = {
  18. // b: undefined
  19. // }
  20. // undefined
  21. // 3
  1. // 练习
  2. function test(){
  3. console.log(b);
  4. if(a){
  5. var b = 2;
  6. }
  7. c = 3;
  8. console.log(c);
  9. }
  10. var a;
  11. test();
  12. a = 1;
  13. console.log(a);
  14. // 分析
  15. // GO = {
  16. // a: undefined -> 1
  17. // test: function test(){....}
  18. // }
  19. // AO = {
  20. // b: undefined
  21. // }
  22. // undefined
  23. // 3
  24. // 1

六、作业

写出下面函数的AO

  1. // 写出AO
  2. function test(){
  3. return a;
  4. a = 1;
  5. function a(){
  6. var a = 2;
  7. }
  8. }
  9. console.log(test());
  10. // 分析
  11. // AO = {
  12. // a: function a(){...}
  13. // }
  14. // a: function a(){...}

特别注意:函数不写return,那么默认的返回值是undefined

  1. // 写出AO
  2. function test(){
  3. a = 1;
  4. function a(){
  5. var a = 2;
  6. return a;
  7. }
  8. }
  9. console.log(test());
  10. // 分析
  11. // AO1 = {
  12. // a: function a(){...} -> 1
  13. // }
  14. // AO2 = {
  15. // a: undefined -> 2
  16. // }
  17. // undefined
  1. // 写出AO
  2. a = 1;
  3. function test(e){
  4. function e(){}
  5. arguments[0] = 2;
  6. console.log(e);
  7. if(a){
  8. var b = 3;
  9. }
  10. var c;
  11. a = 4;
  12. var a;
  13. console.log(b);
  14. f = 5;
  15. console.log(c);
  16. console.log(a);
  17. }
  18. var a;
  19. test(1);
  20. // 分析
  21. // GO = {
  22. // a: undefined -> 1
  23. // test: function test(){...}
  24. // }
  25. // AO = {
  26. // a: undefined - > 4
  27. // e: undefined -> 1 -> function e(){} -> 2
  28. // b: undefined
  29. // c: undefined
  30. // }
  31. // 2
  32. // undefined
  33. // undefined
  34. // 4

七、练习题

  1. var a = false + 1;
  2. console.log(a);
  3. var b = false == 1;
  4. console.log(b);

八、面试题

  1. if(typeof(a) && (-true) + (+undefined) + ''){
  2. console.log('pass');
  3. }else{
  4. console.log('no pass');
  5. }
  1. // 输出结果是什么?
  2. console.log(!!" " + !!'' + !!false || 'pass');
  3. // 输出结果是什么?为什么?
  4. window.a || (window.a = '1');
  5. console.log(a);