JS基础(3)

一、函数

1、函数就是一段待执行的代码段
2、函数可以实现功能的封装,可以实现代码的复用
3、函数使用

         1、函数的声明
         2、函数的调用
        注意 :函数先声明后调用(JS中非强制)

4、语法 :

     1、函数声明

       1、使用function关键字进行函数的声明
              et:
                function 函数名 (参数列表) {
                     函数体;
                     return;
                }
       2、函数名自定义,    普通函数的函数名尽量使用小写或小驼峰
             1. JS中函数声明使用function关键字
             2. 遵照变量命名规范,见名知意
             3、参数列表,参数表示函数体执行所需要的数据(可以为空,为空时()不能省略;多个参数之间使用,隔开)
                 et:
                    function sum (a,b){
                        return a + b;
                    }
             4、函数体就是待执行的代码段
             5、return 表示返回值,将函数体内部执行的结果传递给外界,只能返回一个值(返回值不需要的话,可以省略return)
                 et :
                    function showFn(){
                         console.log("hello");
                    }
                注意:return一定要写在函数体的末尾,return关键字后面的代码都不执行

     2、函数调用

          语法:函数名(参数列表);
          注意:如果函数存在返回值,需要定义变量接收
                    var res = 函数名();

     3、使用:

        1、函数先声明,后调用(非强制)
        2、参数传递:           
             函数声明时定义的参数列表,称为形参,只声明变量,不考虑赋值
              et:
                function sum (a,b){
                       var c = a + b;
                }
            函数调用时给出的参数,是实际参数。调用的过程中,将实际参数赋值给形参,参与函数体中代码的执行。
              et:
                sum(10,20);  //a = 10;b = 20;
        3、函数可以声明多个参数,使用,隔开
        4、函数声明和调用时的参数个数可以不匹配
             et:
               sum(10);
               sum(10,20,30);

     4、匿名函数

      省略函数名的函数
       语法:
          1、var fn = function(){}
             将匿名函数保存给一个变量,使用变量名()的方式调用
                   et: var fn = function (){
                                    函数体;
                          };
                          fn();
          2、匿名函数自执行
                 (function(a,b){
                      console.log("自执行");
                 })(10,20);
              第一个()中表示匿名函数,正常书写
              第二个()中表示函数调用,正常传参

<!doctype html>
<html lang="en">
 <head>
  <meta charset="UTF-8">
  <title>Document</title>
  <script type="text/javascript">
    //1. 无参数,无返回值的函数
    function f1 (){
        console.log("f1");
    }
    f1(); //函数调用

    //2. 有参数,无返回值
    function f2(a){
        console.log(a);
    }
    f2("f2"); 
    //3. 有参数,有返回值
    function sum(a,b){
        /*
        var c = a + b;
        return c;
        */
        console.log(a,b);
        return a + b;
    }
    var res = sum(10,20);
    console.log(res);
    //var input = prompt();

    var r1 = sum(10);
    console.log(r1);

    var r2 = sum(10,20,30);
    console.log(r2);

    //4. 匿名函数
    var f4 = function (){
        console.log("f4");
    };
    f4();
    console.log(f4);

    (function (a,b){
        console.log("自执行",a,b);
    })(10,20);
  </script>
 </head>
 <body>
  
 </body>
</html>
function

      练习:
          改版日期计算器:
            1. 在页面中添加按钮,点击时执行程序
               <button onclick="alert();"></button>
            2. 将闰年判断的代码封装成函数
            3. 整体计算过程封装成函数,按钮点击调用

<!doctype html>
<html lang="en">
 <head>
  <meta charset="UTF-8">
  <title>Document</title>
  <script type="text/javascript">
    //1. 闰年判断
    function isRun (year){
        return year % 400 == 0 || (year % 100 != 0 && year % 4 == 0);
    }

    function calculateDate(){
        //日期计算
        //1.接收用户输入,转换数据类型
        var year = Number(prompt("请输入年份"));
        var month = Number(prompt("请输入月份"));
        var day = Number(prompt("请输入日期"));
        //总天数
        var dayNum = 0;

        //2. 相隔的年份对应天数相加
        for(var i = 1990; i < year; i ++){
            dayNum += 365;
            //闰年判断
            if(isRun(i))
            dayNum ++;
        }

        //3. 当前年中经过的天数
        for(var j = 1; j < month; j ++){
            switch(j){
                case 1 :
                case 3 :
                case 5 :
                case 7 :
                case 8 :
                case 10 :
                    dayNum += 31;
                    break;
                case 4 :
                case 6 :
                case 9 :
                case 11 :
                    dayNum += 30;
                    break;
                case 2 :
                    dayNum += 28;
                    if(isRun(year))
                    dayNum ++;        
            }
        }
        dayNum += day;
        //余数范围 0 - 6 周日 - 周六
        var weekDay = dayNum % 7;
        var show = "";
        switch(weekDay){
            case 0 :
                show = "";
                break;
            case 1 :
                show = "";
                break;
            case 2 :
                show = "";
                break;
            case 3 :
                show = "";
                break;
            case 4 :
                show = "";
                break;
            case 5 :
                show = "";
                break;
            case 6 :
                show = "";
                break;
        }
        alert(year+""+month+""+day+""+"是星期"+show);

    }
  </script>
 </head>
 <body>
    <input type="button" value="日期计算" onclick="calculateDate();">
 </body>
</html>
练习

二、变量作用域

1、变量起作用的范围   
2、分类 :

    1、全局作用域

         处在全局作用域中的变量就是全局变量,在整个程序的任何地方都可以访问和使用。
         使用:
               1. 所有在函数外部通过var声明创建的变量,都是全局变量(在任何地方都可以访问)
               2. 声明变量时,省略var关键字创建的变量,都是全局变量(推荐使用var关键字,不要省略)

    2、局部作用域 (JS中局部作用域指的是函数作用域)

     在函数体内部起作用的变量,称为局部变量
     函数体的{}就是局部作用域
     使用:
           1、在函数内部使用var关键字定义的变量都是局部变量,只在当前函数作用域(函数体)中可以访问,外界无法访问
           2、局部变量出了函数就不能访问了
     注意 :
         在函数中访问变量,
             1. 如果当前函数中没有该变量,就访问全局作用域中的变量
             2. 如果当前函数中定义了该变量,全局中也有相同的变量名,函数就近访问变量

    3、作用域查找:

        如果函数内部与外部定义了同名的变量,函数体中访问,采用就近原则
        先查找当前局部作用域,找不到再到上一级作用域中查找

<!doctype html>
<html lang="en">
 <head>
  <meta charset="UTF-8">
  <title>Document</title>
  <script type="text/javascript">
    var a = 100;
    b = 200;
    function fn(){
        var c = 300;
        //所有省略var关键字定义的变量,都是全局变量
        d = 400;
        var a = 1000;
        console.log("fn-"+a);
    }
    fn();
    console.log("外部-"+a);

    function f1(){
        function f2 (){
            console.log(a);
        }
        f2();
    }
    f1();
  </script>
 </head>
 <body>
  
 </body>
</html>
作用域

三、数组Array

1、有序的元素序列,用来存放一些数据

     (数组中的元素会自动分配下标,从0开始,方便读写)

2、创建数组

   1、创建空数组
         var 数组名 = [];
             et:var arr1 = [];            //创建空数组
   2、创建空数组
         var 数组名 = new Array();    
         et:var arr2 = new Array();   //创建空数组
   3、初始化元素
         1、创建数组的同时初始化元素
              var 数组名 = [元素1,元素2,...];
                 et:var arr3 = [10,20,30];
         2、根据下标初始化元素
             数组会为元素自动分配下标,从0开始
               var arr4 = [];
               arr4[0] = 100;
               ...
               arr4[3] = 200;
          3、使用new关键字初始化
               var 数组名 = new Array(元素1,元素2,...);
                  et:var arr5 = new Array(10,20,30);
          4、初始化数组长度
               var 数组名 = new Array(Num);
               只包含一个数值参数时,表示初始化数组长度
                  et:var arr6 = new Array(5);//创建长度为5的数组

<!doctype html>
<html lang="en">
 <head>
  <meta charset="UTF-8">
  <title>Document</title>
  <script type="text/javascript">
    //1.创建空数组
    var arr1 = [];
    var arr2 = new Array();
    console.log(arr1,arr2);
    //2. 初始化数据
    //2.1 根据下标初始化元素
    arr1[0] = 10;
    arr1[1] = 20;
    console.log(arr1);

    var arr3 = ["中午","吃什么"];
    var arr4 = new Array(100,200);
    console.log(arr3,arr4);

    //3. 初始化数组长度
    var arr5 = new Array(10);
    console.log(arr5.length);

    //清空数组
    var arr6 = [1,2,3,4,5];
    console.log(arr6);
    arr6.length = 0;
    console.log(arr6,arr6.length);
  </script>
 </head>
 <body>
  
 </body>
</html>
array

3、使用:

    1、使用"数组名[index]"的方式操作数组元素
          语法:数组名[下标];
          说明:数组中每一个元素都有对应的下标,元素的下标范围 0 -> length-1
                    根据下标访问元素 :arr[8]
                    根据下标修改元素 :var a = arr[8];
    2、数组是对象类型
         对象是由属性和方法组成的
         通过点语法访问对象的属性和方法
         属性:
             1、length:获取数组长度
                     使用:数组名.length;
                         et:arr.length;    
             2、清空数组中元素
                         arr.length = 0;
    3、遍历数组
         循环输出数组元素
         et:
             //正序
             for(var i = 0; i <= arr.length - 1; i ++){
                  console.log(arr[i]);
             }
             //倒序
             for(var i = arr.length -1; i >= 0 ; i --){
                  console.log(arr[i]);
             }

     练习 1:
         1. 循环接收用户输入的数据
         2. 将用户输入的数据存在数组中
         3. 当用户输入exit时,停止输入
         4. 存储结束之后,输出数组元素
     练习 2:
         创建包含若干元素的数组(number),
         遍历数组,输出最大值
     练习 3:
         创建包含若干数字的数组,接收用户输入,
         判断数组中是否存在用户输入的数字,存在
         则返回对应的下标,不存在提示用户数据不存在
     练习 4:
         创建数组,保存三个数据(number),比较数据大小,
         并进行排序,最终按照从小到大的顺序输出

<!doctype html>
<html lang="en">
 <head>
  <meta charset="UTF-8">
  <title>Document</title>
  <script type="text/javascript">
    //1. 接收用户输入并存储
    function saveData(){
        var arr = [];
        do{
            var input = prompt("请输入数据");
            //arr.length可以作为数组中下一个元素的下标
            if(input != "exit")
            arr[arr.length] = input;

        }while(input != "exit");
        console.log(arr);
    }
    //2. 遍历数组找最大值
    function findMax(){        
        var arr = [12,45,65,24,78,966,33,-1,-987,5];
        //定义变量保存最大值,初始值必须是数组中存在的数据
        var maxNum = arr[0];
        for(var i = 1; i < arr.length; i++){
            //取数组中元素与maxNum进行比较
            if(arr[i] > maxNum){
                maxNum = arr[i];
            }
        }
        console.log(maxNum);
    }

    function findIndex(){
        //3. 查找下标
        var arr = [12,45,65,24,78,966,33,-1,-987,5];
        var input = prompt("请输入数字");
        var index = ""; //index用来保存数组下标
        for(var i = 0; i < arr.length; i ++){
            //在组中查找到数据,将下标赋值给index
            if(arr[i] == input) index = i;
        }
        if(index == ""){
            console.log("查询失败",arr);
        }else{
            console.log(input+"对应的下标为"+index,arr);
        }

    }
    //4. 数组排序
    var arr = [64,128,37];
    if(arr[0] > arr[1]){
        //互换两个下标位置的值
        arr[0] = arr[0] ^ arr[1];
        arr[1] = arr[0] ^ arr[1];
        arr[0] = arr[0] ^ arr[1];
    }
    if(arr[1] > arr[2]){
        arr[1] = arr[1] ^ arr[2];
        arr[2] = arr[1] ^ arr[2];
        arr[1] = arr[1] ^ arr[2];
    }
    if(arr[0] > arr[1]){
        //互换两个下标位置的值
        arr[0] = arr[0] ^ arr[1];
        arr[1] = arr[0] ^ arr[1];
        arr[0] = arr[0] ^ arr[1];

        /*
        //借助中间变量 var a = 3, b = 5;
        var c = arr[0];
        arr[0] = arr[1];
        arr[1] = c;
        */
    }
    console.log(arr);
  </script>
 </head>
 <body>
  
 </body>
</html>
练习

4、常用方法:

 常用API

  1、toString()
          将数组内容转换为字符串,并返回。
  2、join()
           将数组中元素拼接成一个字符串,并返回
           参数 :可以指定数组元素之间的连接符,省略的话,默认以逗号连接。
             et:
                var arr = [1,2,3];
                arr.join();   //返回字符串 "1,2,3"
                arr.join('-'); //返回字符串 "1-2-3"
  3、reverse()
        反转数组元素,倒序重排元素
        返回反转后的数组
        注意:
              reverse()是对当前数组结构的调整,不会生成新的数组,
              直接反转原始数组,可以不接收返回值。
  4、sort()
          1、将数组内容进行排序,返回排序后的数组
          2、默认按照Unicode编码升序排列
               注意:
                   sort()方法也是对数组结构的调整,直接对原数组的元素进行排序,会改变原始数组
          3、参数可以为自定义的排序函数
               et:
                  function sortAsc(a,b){
                       return b - a;  // b-a两两比较,倒序排列
                  }
                  arr.sort(sortAsc);
                  console.log(arr);
  5、push(data)
         表示在数组的末尾追加元素
         参数 :可以是一个,也可以是多个,多参数之间使用逗号隔开。
         返回值 :返回新数组的长度
  6、pop()
         表示删除数组最后一个元素
         返回值 :返回被删除的元素
         数组的存储结构
                   数组在内存中使用栈结构存储,先进后出
  7、unshift(data)
         向数组的头部添加元素
         参数 :可以是一个元素,也可以是多个元素
         返回值 : 返回添加元素之后的数组长度
  8、shift()
         删除数组的头部元素
         返回值 :返回被删除的元素

<!doctype html>
<html lang="en">
 <head>
  <meta charset="UTF-8">
  <title>Document</title>
  <script type="text/javascript">
    //1. toString()
    var arr = [1,2,3];
    var res = arr.toString();
    console.log(arr,res);

    //2. join()
    var r1 = arr.join();
    console.log(r1);
    var r2 = arr.join("-");
    console.log(r2);

    //3. reverse()
    var r3 = arr.reverse();
    console.log(r3,arr); //[3,2,1]
    console.log(arr.reverse());

    //4. sort()
    var arr2 = [200,10,300,54,5];
    var r4 = arr2.sort();
    console.log(r4,arr2);

    //自定义排序函数
    function sortAsc(a,b){
        //b - a 两两比较,倒序排列
        return b - a;
    }
    arr2.sort(sortAsc);
    console.log(arr2);

    //5. push()
    var arr3 = ["hello"];
    var res1 = arr3.push("小明");
    console.log(res1,arr3);
    var res2 = arr3.push(1,2,3);
    console.log(res2,arr3);

    //6. pop()
    var res3 = arr3.pop();
    console.log(res3,arr3);

    //7. unshift()
    var res4 = arr3.unshift("first","second","third");
    console.log(res4,arr3);

    //8.shift()
    var res5 = arr3.shift();
    console.log(res5,arr3);
  </script>
 </head>
 <body>
  
 </body>
</html>
API

5、二维数组

       数组中的每一个元素的是一个小数组
   er:
        var arr = [["唐僧","悟空"],["宝玉","宝钗"],["伏地魔"]];
    访问元素:
         arr[0];    //["唐僧","悟空"]
         arr[0][0]; //"唐僧"

   练习:
       1、接收用户输入的数字
       2、转换为二进制并输出
             var n = 10;
             10 / 2 = 5  ------ 0
             5 / 2 = 2 ---------1
             2 / 2 = 1 ---------0
             1 / 2 = 0 ---------1
             10的二进制 1010

<!doctype html>
<html lang="en">
 <head>
  <meta charset="UTF-8">
  <title>Document</title>
  <script type="text/javascript">
    var input = Number(prompt("请输入数字"));
    var arr = [];
    while(input > 0){
        //转换二进制
        arr[arr.length] = input % 2;
        //结果是小数,取整数商参与下一次除2
        input = parseInt(input / 2);    
    }
    arr.reverse(); //反转数组
    var r = arr.join(''); //拼接字符串
    console.log(r);
  </script>
 </head>
 <body>
  
 </body>
</html>
练习

posted on 2018-10-20 15:21  破天荒的谎言、谈敷衍  阅读(192)  评论(0)    收藏  举报

导航