JScrip笔记

第一章初识JScrip

  1. 输入输出

            //输出语句
    
            //用于在浏览器中弹出警告框
            window.alert('未满十八岁禁止访问')
    
            //用于在网页中输出内容
            document.write('我刚满十八~~~~~~~')
    
            //用于在控制台中输出信息
            console.log('123456')
    
    
            //在浏览器中弹出输入框,用户可以输入内容
            prompt('请输入你的年龄')
            
            //在浏览器中弹出确认框
            confirm('你真的十六岁嘛')
  2. JS代码引入方式

    1. 行内式

      <body>
          <!-- 行内式 -->
          <!-- 行内式是指:将 JS 代码入到 html 中,但不通过 script 标签。 -->
          <button onclick="window.alert('别点了')">电玩鸭</button>
      </body>
    2. 嵌入式

      <body>
      <!-- 嵌入式 -->
          <!--  嵌入式是指:将 JS 代码写在 script 标签的内部。 -->
          <script>
              document.write('就要镶你')
          </script>
      </body>
    3. 外链式

      <body>
      <!-- 外链式 -->
          <!-- 创建一个 js文件,在 js文件中,书写代码。
               在 html 文件中,通过路径引入 css 文件。 -->
          <script src="./03-外链式.js"></script>
      </body>

第二章基本代码语法

  1. 变量

    1. 变量声明与赋值

      <body>
          <script>
              //[先声明再变量]
      
      /*         //变量声明
              var tom;//声明了一个tom变量
              var lily
              var jack,jackson;//同时声明了2个变量
      
       */
      
              //为变量赋值
              tom = 'boy';
              lily = 'girl';
      
      
      
              //输出变量的值
              console.log(tom);
              console.log(lily);
      
      
      
              //[在声明的同时直接赋值]
              var height = 188;
              console.log(height)
      
          </script>
      </body>

    2. let声明变量

      1. **块级作用域**:`let`声明的变量只在声明它的代码块内有效,包括`if`、`for`、`while`等控制结构的块,以及函数体。这意味着同一作用域内的不同代码块可以有同名的`let`变量,它们互不影响。
      2. **暂时性死区**:在变量被`let`声明的位置之前,尝试访问该变量会导致错误,因为变量在声明之前存在于一个“死区”。
      3. **不可重新声明**:在同一个作用域内,不能重新声明已经被`let`声明过的变量,否则会抛出错误。
      4. **无函数作用域**:`let`声明的变量不会像`var`那样在整个函数作用域内有效,只限于当前代码块。
      5. **非变量提升**:与`var`不同,`let`声明的变量不会被提升到作用域的顶部,因此在声明前访问会报错。

    3. const声明变量
      1. **常量声明**:`const`用于声明不可变的常量,声明时必须初始化,并且一旦赋值,值就不能再改变。
      2. **块级作用域**:与`let`一样,`const`声明的常量也具有块级作用域,只在声明它的代码块内有效。
      3. **对象和数组的引用不变**:如果`const`声明的是对象或数组,虽然引用本身是不可变的,但对象或数组的属性和元素是可以修改的。
      4. **不可重新声明**:和`let`一样,`const`也不能在同一作用域内重新声明。
      5. **暂时性死区**:同样存在暂时性死区,即在变量声明之前尝试访问会导致错误。

  2. 数据类型

    1. 基础数据类型

      <body>
          <script>
              console.log();
              console.log()
      
      
      
      
              // undefined-未定义的类型
              // 表明变量还未被赋值
              let baby;
              console.log(baby);//undefined
              baby='angelbaby'
              console.log(baby);//angelbaby
      
              // null-空型
              // 空型只有一个一个特殊的null值,表示变量没有指向任何对象
              
          </script>
      </body>

    2. 数据类型检测

      <body>
          <script>
              // 当不确定一个变量或值是什么类型的数据时
              // 就用typeof操作符进行数据类型检测
      
              // typeof 数据
              // typeof(数据)
      
              let a =typeof (111)
              console.log(a);//number
      
              console.log(typeof"111");//string
      
              console.log(typeof NaN);//number
      
              console.log(typeof -Infinity);//number
      
              console.log(typeof true);//boolean
      
              console.log(typeof "false");//stcing
      
              console.log(typeof undefined);//undefined
      
              console.log(typeof null);//object
          </script>
      </body>

    3. 数据类型转换

      <body>
          <script>
              // 1.将数据类型转换为布尔型数据
              //转换时,代表空或者否定的值(空字符串.)
              //其他的值就会转换为true。
      
              let a =Boolean("")
              console.log(a);//false
      
              console.log(Boolean(""));//true
      
              console.log(Boolean("false"));//true
      
              console.log(Boolean(0));//false
      
              console.log(Boolean(undefined));//false
      
              console.log(Boolean(null));//false
      
              console.log(Boolean("null"));//true
      
              console.log(Boolean(Infinity));//true
      
              console.log(Boolean(2));//true
      
              // 2.将数据转换为数字型数据
              // Number()
      
              console.log(Number(true));//1
              console.log(Number(false));//0
              console.log(Number(undefined));//NaN
              console.log(Number(null));//0
              console.log(Number("123"));//123
              console.log(Number("123.a"));//NaN      
              console.log(Number(""));//0
              console.log(Number("  "));//0
              console.log(Number("true"));//NaN
      
              // 3.将数据类型转换为字符串数据
              let b = false;
              console.log(typeof b);//boolean
              var c = toString(b)
              console.log(typeof c);//string
      
      
      
          </script>
      </body>

预算符

  1. 算数预算符

    1. 加法(+):用于将两个数字相加或将字符串连接在一起。
    2. 减法(-):用于将一个数字减去另一个数字。
    3. 乘法(*):用于将两个数字相乘。
    4. 除法(/):用于将一个数字除以另一个数字。
    5. 取余(%):用于计算两个数字相除后的余数。
    6. 递增(++):用于将一个数字增加1。
    7. 递减(--):用于将一个数字减少1。
      <body>
          <script>
              //加号预算符
              let a = 10;
              let b = 20;
              let c = a + b;
              console.log(c);//30
      
              //减法预算符
              console.log(c-a);//20
      
              // 乘法运算符
              console.log(a*b);//200
      
              // 除法运算符
              console.log(b/a );//2
      
              // 取模运算
              console.log(c%b);//10
      
              // 幂运算
              console.log(2**10);//1024
              // 2*2*2*2*2*2*2*2*2*2
      
              // 自增运算(前自增)
              let m = 10;
              let n = 20;
              m = ++n;
              console.log(m);//21
              console.log(n);//21
      
              // 自增运算 (后自增)
              m =n  ++;
              console.log(m);//21
              console.log(n);//22
      
              // 自减运算(前自减)
              m = --n ;
              console.log(m);//21
              console.log(n);//21
      
              // 自减运算(后自减)
              m = n --;
              console.log(m);//21
              console.log(n);//20
      
              var  x = 3;
              console.log(x);//3
              console.log(++x);//4
              console.log(x++);//4
              console.log(x);//5
      
              console.log(--x);//4
              console.log(x);//4
              console.log(x--);//4
              console.log(x);//3
      
      
      
      
          </script>
      </body>

  2. 字符串运算符

    1. **字符串连接运算符(+)**: - 使用`+`运算符可以将两个或多个字符串合并成一个新的字符串。
    - 如果其中一个操作数不是字符串,JavaScript会尝试将其转换为字符串。
    - 示例:`"Hello" + "world"` 结果为 `"Hello world"`。
    2. **扩展运算符(+=)**: - `+=`运算符用于在现有字符串后追加内容,相当于`string = string + value`。
    - 它同样会将右侧的值转换为字符串再进行连接。
    - 示例:`let str = "Hello"; str += " world";` 结果,`str`变为 `"Hello world"`。
     
  3. 赋值运算符
     

    <body>
        <script>
            var a =10;
            var b =20;
    
            //加并赋值
            a += b;
            //a = a + b
            console.log(a);//30
            console.log(b);//20
    
            //减并赋值
            a-=b;
            //a= a-b
            console.log(a);//10
            console.log(b);//20
    
            //乘并赋值
            a *=b
            //a= a*b
            console.log(a);//200
            console.log(b);//20
    
            //除并算符
            a /= b
            //a = a/b
            console.log(a);//10
            console.log(b);//20
    
            //取模赋值
            a %= b
            //b = b % a
            console.log(a);//10
            console.log(b);//20
    
        </script>
    </body>

  4. 比较运算符
     

    <body>
        <script>
            //  ==相等运算符
            console.log(5=="5");//true
    
            //  ===全等运算符
            console.log( 5 ==="5");//false
    
            //  != 不相等
            console.log(5 !="5");//false
    
            //  ! == 不全等
            console.log( 5 !== "5");//true
    
    
        
            //  ==和!=在比较不同数据类型时,会将比较的数据装换为同一类型
            //  ===和!==则不会转换
        </script>
    </body>

  5. 逻辑运算符
     

    <body>
        <!-- 
            &&逻辑与运算符   一假则假
            || 逻辑或运算符  一真则真
            ! 逻辑非运算符/取反运算符 真作假来假亦真做
         -->
        <script>
            console.log(true && true);//true
            console.log(false && true);//false
            console.log(true && false);//false
            console.log(false && false);//false
    
    
            console.log(true || true);//true
            console.log(true || false);//true
            console.log(false || true);//true
            console.log(false || false);//false
    
    
            console.log(3 > 2 && 2 > 1);//true
            console.log(3 > 2 && 2 < 1);//false
            console.log(3 > 2 || 2 < 1);//true
    
            console.log(!true);//false
            console.log(!(100<0));//tyre
    
            // var height;
            // var score;
            // height > 188 && score>90;
    
            // 闰年
            // 可以被400整除 但不能被100整除的年份
            var year =prompt('请输入一个年份');
            var res=year %400==0 ||  year %4==0 && year%100!=0
            // 当满足39行判断 res的值为true,也就是year不为闰年。
            //当不满足39行判断;res的值为false,也就是year不为闰年。
            console.log(res);
            // 三元表达式
            //如果res的值是true,就会执行冒号前面的语句
            // 如果res的值是false,就会执行冒号后面的语句
            res ? document.write('闰年') : document.write('平年')
    
    
        </script>
    </body>

  6. 三元运算符

    <body>
        <script>
            // 条件表达式? 表达式1 : 表达式2
    
            // 如果条件表达式的值为ture, 则返回表达式1的执行结果
            // 如果条件表达式的值为false, 则返回表达式1的执行结果
    
    
    
            
            // 需求:用户输入年龄,判断用户是成年人还是未成年人
            var aeg =15;
            var status = aeg >=18?'已成年': '未成年';
            console.log(status); 
    
    
    
            // 需求2:
            // 需求(1):让用户输入俩个数字
            // 需求(2):比较俩个数字大小,并在网页面显示最大的那个数字
            var num1 = prompt('请输入数1')
            var num2 = prompt('请输入数2')
            num1 > num2 ? console.log(num1) : console.log(num2);
    
    
            // 需求3:
            // 如果用户输入的是俩位数,则直接输出
            // 如果用户输入的是个位数,则在十位数上补0
            var num = prompt('请输入数一个数字')
            num >= 10 ? console.log(num) : console.log("0" + num);
    
        </script>
    </body>
  7. 运算符优先级

    <body>
        <script>
            // 小括号 > 一元运算符 > 比较运算符 > 逻辑运算符(逻辑与>逻辑或)  > 赋值运算符
    
            let a = 3>5 && 2<7 && 3==4
            //    false    true    false
            console.log(a);//false
    
            let b = 2 =="2"
            console.log(b);//true
    
            let c =!b || a && b
            console.log(c);//false
            false || false  && true;
    
            let ayg
    
    
        </script>
    </body>
    

流程控制

选择结构

<body>
    <script>
        1.if语句
        if(条件表达表达式){代码段}

        let age =prompt('请输入你的年龄');
        console.log(age);
        if (age >= 18) {
            document.write("恭喜你成年了")
        }

        2. if...else  if...else语句
        if (条件表达式1) {
            代码段1
        }else if (条件表达式2
        ) {
            代码段2
        } else if (条件表达式3) {
            代码段3
        } else if (条件表达式4) {
            代码段4
        } else{
            代码段n
        }

        3:switch语句
        let subject =  +prompt("请输入你想要专业的专业。1-是啊发发,2-仓库打的,3-点开垃圾掉dj,4-dj")
        switch(subject){
            case 1:
            document.write("恭喜你选择了点开垃圾掉dj专业");
            break;
            case 2:
                document.write("恭喜你选择了是啊发发专业");
            break;
            case 3:
                document.write("恭喜你选择了仓库爱打的专业");
                break;
            case 4:
                document.write("恭喜你选择了dj专业");
                break;

                default:
                    document.write("请重新选择专业")
        } 

循环结构

<body>
    
    <script>
        1.for语句
        for(初始变化;条件表达式;操作表达式){循环体}

        2.while 语句
         while(条件表达式){循环体}

        3.do...while语句
        do{循环体} while (条件表达式)
    </script>

</body>

跳转语句
 

<body>
    <script>
        //1.break
        break语句用于跳出整个循环
        for(var i = 1; i <=5; i++){

            if(i==3){
                 console.log("白雪公主吃到了毒苹果");
                 break;
            }


            console.log("白雪公主吃了"+i+"个苹果");
        }


        //2.continue
        continue结束当前循环
        for (var i = 1; i <= 5; i++) {

                if (i == 3) {
                    console.log("白雪公主吃到了shi苹果");
                    continue;
                }


                console.log("白雪公主吃了" + i + "个苹果");
            }


        
    </script>

循环嵌套

<body>
    <script>
        // 需求打印四排星星
        // var str ="";
        //成列
        for (let i = 1; i <=4; i++){
           // 成行
            for (let i = 1; i <= 4; i++) {

                str +="*";
             }
             // "\n"换行转义符
            str += "\n"
         }
    
  console.log(str);
    

</script>
</body>

第三章数组

数组的基本操作

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <script>
      //【创建数组】
      //1.以数组字面量创建数组
      var array = [1, 2, 3, 4, 5];
      console.log(array); //[1,2,3,4,5]
      //2.以new Array()方式创建数组
      var array1 = new Array(1, 2, 3, 4, 5);
      console.log(array1); //[1,2,3,4,5]

      //【数组构成】
      //数组的值可以是任意类型的数据
      var array2 = ["string", 123, null, undefined, NaN, array];
      console.log(array2); //['string',123,null, undefined, NaN

      //【数组长度】
      console.log(array2.length); //6
      console.log(array.length); //5

      //【访问数组】
      //"数组索引"也称为"数组下标”,以数字表示,默认是从0开始以此递增
      console.log(array[3]); //4
      console.log(array[4]); //5
      console.log(array2[0]); //string

      //【更改数组】通过下标更改
      var array4 = [1, 2, 3, 4, 5];
      array4[0] = 0;
      console.log(array4); //[0,2,3,4,5]

      //【新增数据】通过下标新增
      array4[7] = 10;
      console.log(array4); //(8) [0, 2, 3, 4, 5, empty ,empty ,10]
      console.log(array4.length); //8

      //【删除数组】利用delete关键字+下标删除
      delete array4[7];
      console.log(array4); //0, 2, 3, 4, 5, empty,empty,empty ]
      console.log(array4.length); //8

      //【修改元素长度】 通过.length修改
      array4.length = 5;
      console.log(array4); //[0, 2, 3, 4, 5]
      array4.length = 20;
      console.log(array4); //[0, 2, 3, 4, 5, empty x 15]

      //【数组方法】
      //在数组前新增元素  unshift
      var arr1 = [4, 5, 6];
      arr1.unshift(1, 2, 3);
      console.log(arr1); //[1,2,3,4,5,6]
      // 在数组后新增元素  push
      arr1.push(7, 8, 9);
      console.log(arr1); //[1,2,3,4,5,6,7,8,9]
    </script>
  </body>
</html>

遍历数组

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <script>
      //for(初始变化;条件表达式;操作表达式){循环体}
      var array = ["jack", "lily", "tom", "toy"];

      console.log(array[0]);
      console.log(array[1]);
      console.log(array[2]);
      console.log(array[3]);

      //使用变量i代替元素的下标
        for (var i = 0; i <= array.length; i++) {
          console.log(array[i]);
      jack
      lily
      tom
      toy
        }

      //需求;遍历[1,2,3,4,5,6,7,8,9,10]数组
        var array1 = [1,2,3,4,5,6,7,8,9,10];
        for (var e = 0; e <= array1.length; e++) {
          console.log(array1[e]);}

      // 需求;求出arr数组中各项的累加和
        var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
        var sum = 0;
        for (var e = 0; e < arr.length; e++) {
          sum += arr[e];
          console.log(sum);
        }

      // 需求:去除掉arr中小于0的值,形成一个新数组。
        var arr1 = [0, -5, 10, -30, 30, 70, 55, -35, 90];
        var arr2 = [];
        for (var i = 0; i <= arr1.length; i++) {

          if (arr1[i] >= 0){
          console.log(arr1[i]);
          arr2.push(arr1[i]);
        }
      }
        console.log(arr2);

      //需求; 求出数组最大值,最小值
      let score = [60, 78, 56, 45, 34, 23, 23, 54, 76];
      // 假设一个最高值,一个最低值
      var max = min =score [0];//假设最高最低是60
      for (var i =1; i < score.length; i++){
        // console.log(score[i]);
        // 求最大值
        if(score[i]>max){
          max = score[i]
        }
        // 求最小值
        if(score[i]<min){
          min = score[i]
        }
      }
      console.log(max);
      console.log(min);

      // 需求:将数组["一","二","三","四","五"]反转
      反转后的新数组为['五','四','三','二','一']
      方法一
      let array = ["一", "二", "三", "四", "五"];
      let reversedArray = array.reverse();
      console.log(reversedArray); // 输出: ['五', '四', '三', '二', '一']

      // 方法二
      var arr3 = ["一", "二", "三", "四", "五"];
      var arr4 = [];
      for(var i=0;i< arr3.length; i++){
        // console.log(arr3[i]);
        arr4[arr3.length-1-i]= arr3[i]
      }
       console.log(arr4);

      // 方法三
      var arr3 = ["一", "二", "三", "四", "五"];
      var arr4 = [];
      for (var i = 0; i < arr3.length; i++) {
        // console.log(arr3[i]);
        //unshift在数组前添加元素
        arr4.unshift(arr3[i]);
      }
      console.log(arr4);

      // 方法四
      var arr3 = ["一", "二", "三", "四", "五"];
      var arr4 = [];
      for (var i = arr3.length - 1; i >= 0; i--) {
        console.log(i); //4 3 2 1 0
        console.log(arr3[i]);
        arr4.push(arr3[i]);
      }
      console.log(arr4);
    </script>
  </body>
</html>

二维数组

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <script>
      // 一维数组
      var arr1 = [1, 2, 3, 4, 5];
      //二维数组
      var arr2 = [
        [1, 2, 3],
        [4, 5, 6],
        [7, 8, 9],
      ];
      console.log(arr2[0]); //123
      console.log(arr2[0][0]); //1
      console.log(arr2[1][1]); //5

      //需求;将数组arr2中的每一个元素一一打印出来
      for (var i = 0; i < arr2.length; i++) {
        for (var j = 0; j < arr2[i].length; j++) {
          console.log(arr2[i][j]);
        }
      }

      //需求;二维数组倒置
      var arr2 = [
        [1, 2, 3, 4, 5, 6],
        [7, 8, 9, 10, 11, 12],
        [13, 14, 15, 16, 17, 18],
      ];
      var res = [];
      //渲染新数组,首先要知道新数组有多少行
      //新数组的行数是有原数组的列属决定的

      for (var i = 0; i < arr2[0].length; i++) {
        //通过遍历原数组的行数 首先得到新数组的列数
        res[i] = [];
        //遍历原数组的列,得到新的数组
        for (var j = 0; j < arr2.length; j++) {
          console.log(arr2[j][i]);
          res[i][j] = arr2[j][i];
        }
      }
      console.log(res);
      //需求;二维数组求和
      var score = [
        [1, 4, 7],
        [2, 5, 8],
        [3, 6, 9],
      ];
      var sum = 0;
      for (var i = 0; i < score.length; i++) {
        console.log(i); //0,1,2,3
        sum = 0;
        //console.log(sum);//会得到四个sum=0
        for (var j = 0; j < score[i].length; j++) {
          console.log(score[i][j]);
          sum += score[i][j];
        }

        console.log("第" + (i + 1) + "为的同学的总成绩" + sum);
      }
    </script>
  </body>
</html>

数组迭代方法

1-map数组迭代方

map:使用某种规则映射得到一个数组

 遍历数组中的每一个元素,并对每个元素进行相应的处理,并返回新的数组

回调函数一定要有返回值

      // 语法  数组.map((元素,下标)=>{return 映射规则})

2-filter数组过滤器法

filter:用于筛选数组中满足条件的新数组并返回

        // 形成的新数组长度!== 原数组长度

        // 回调函数执行的次数 == 数组长度

3-forEach数组遍历器

 forEach也是用于遍历数组

      // forEach没有返回值,不用写return,也不创建新的数组,它只是简单地执行一个函数,对数组中的每个元素执行一次

4-some

some:判断数组中是否有元素满足条件

      //返回一个布尔类型的值

      //一旦有元素符合条件,则返回true。

5-every

every:判断数组中是否所有元素满足条件

      //返回一个布尔类型的值;

      //当所有元素符合条件,则返回true.

6-findlndex

它用于查找数组中满足给定测试函数的第一个元素的索引。如果找到这样的元素,它返回该元素的索引;如果没有找到,返回`-1`

- `callback`:必需,一个测试函数,对于数组中的每个元素都会调用此函数。它接受三个参数: - `element`:当前元素的值。
- `index`(可选):当前元素的索引。
- `array`(可选):调用`findIndex()`的数组。 - `thisArg`(可选):在执行回调函数时用作`this`的值。

7-reduce

它用于对数组的所有元素执行一个函数,通常用来将数组“减少”到单个值。这个函数可以累加或聚合数组的元素,或者执行其他计算

reduce()`的回调函数通常执行以下操作:
1. 初始化或累加`accumulator`。
2. 将当前元素`currentValue`与`accumulator`结合。
3. 返回新的`accumulator`值,供下一次调用使用。

第四章-函数

初食函数

【函数定义】
 函数用于封装完成一段特定功能的代码。
相当于将一条或多条语句组成的代码块封装起来
用户在使用时只需要关心参数和返回值,就能完成特定的功能。

       //【内置函数】
      // isNaN是判断内容是否为非数字。非数字时取值为true,数字类型取值为false。
      console.log(isNaN("numder")); //true
      //Number()可以将字符串类型转化为数字类型
      console.log(Number("15.99")); //15.99
      console.log(parseInt("15.99")); //15
      // parseInt()将小数点前面的内容转化为数字类型
      console.log(parseInt("15.abc")); //15

      // 自定义函数
      //提高代码的复用性,降低程序维护的难度

      //【函数格式】
      function name(params) {}
      // function指这是一个函数语句
      // name是函数名
      // params是函数参数
      //{}内放函数的具体功能

      //【无参函数】
      // 封装函数
      function demo() {
        console.log("我是一个函数");
      }
      // 使用函数
      demo();
      demo();
      demo();
      demo();

      //【有参函数】
      function sum(a, b) {
        console.log(a + b);
      }
      sum(100, 200);
      sum(99, 88);

      // 封装函数
      function total(price, num) {
        console.log(price * num);
      }
      // 调用函数
      total(99, 3);

      // 【函数的返回值】
      // 函数的返回是指在函数调用后获得的数据
      // 这个数据需要通过return关键字返回,让函数外可以拿到
      function total1(price, num) {
        return price * num;
      }
      console.log(total1(999, 12));

      // 函数total1是在函数内部打印乘积
      // 每次调用total函数就会执行一次打印命令

      ///函数total1是在函数内部生成一个新的数值并通过return返回
      // 在函数外拿到return返回的数据并打印

      //【获取函数调用时传递的所有实参】
      function num(a,b){
        console.log(a,b);
      }
      num(1,2)//12
      num(1,2,3,4,5,6)//1 2
      num(1)// 1 undefined

      // 扩展运算符...
      function num1(...nums){
        console.log(nums);
      }
      num1(1)//1
      num1(1,2,3,4,5,6)//[1,2,3,4,5,6]

      //argument对象
      //在开发时,如果不确定行参的个数,可以不设置形参
      //在函数体中直接通过argument对象获取函数调用时传递的形参
      function num2() {
        console.log(arguments);
        console.log(arguments.length);
      }
      num2(1,2,3,4,5,6)
      num2(1,2,3)

函数进阶

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <script>
      //【函数表达式】
      //函数表达式是指将函数值赋给变量的表达式

      let num = 1;
      console.log(num); //1

      let fun = function sum(num1, num2) {
        console.log(num1 + num2); //3
      };
      // 定义了函数表达式之后,不能再通过函数名调用函数
      // sum(1,2)
      // 需要通过变量名调用函数
      fun(1, 2);

      //【匿名函数】
      // 当使用函数表达式时,可以删除函数的名字
      let fun1 = function sum(num1, num2) {
        console.log(num1 + num2); //3
      };
      fun1(1, 2);
      let fun2 = function (num1, num2) {
        return num1 + num2;
      };
      console.log(fun2(1, 2));

      //【箭头函数】
      // 删除function关键字
      //在参数()和函数体{}之间放上=>
      let fun3 = (num1, num2) => {
        return num1 + num2;
      };
      console.log(fun3(1, 2));

      //当函数体只有一句话时,可以省略return返回值和大括号
      let fun4 = (num1, num2) => num1 + num2;
      console.log(fun4(1, 2));

      // 当函数只有一个参数时,可以省略小括号
      let demo = (a) => a + a;
      console.log(demo(1));

      function demo(a) {
        return a + a;
      }
    </script>
  </body>
</html>

回调函数

  <body>
    <script>
      //   function demo(a,b) {
      //       console.log(a+b);

      //   }
      //   demo(1,2)
      //   demo(1,23)

      // 回调函数,就是在a中,传入一个函数b作为参数,参数函数b就是回调函数。
      function cal(num1, num2, fn) {
        return fn(num1, num2);
      }

      var num = cal(10, 20, function (num1, num2) {
        return num1 + num2;
      });
      console.log(num); //30
      console.log(
        cal(30, 40, function (num1, num2) {
          return num1 + num2;
        })
      ); //70

      var num1 = cal(30, 40, function (num1, num2) {
        return num1 * num2; //1200
      });
      console.log(num1);
      console.log(
        cal(30, 40, function (num1, num2) {
          return num1 * num2;
        })
      ); //1200
    </script> 
  </body>

函数作用域

<body>
    <script>
      //      全局作用域:全局变量拥有全局作用域
      // 全局变量:在函数体外声明的变量或在函数体内省略var关键字声明的变量
      var name = "张三";
      let age = 18;
      function fun() {
        console.log(name);
        console.log(age);
      }
      fun();
      console.log(name);
      console.log(age);

      //   局部作用域:局部变量/函数变量拥有局部作用域
      function fun1() {
        var sex = "men";
        console.log(sex); //men

        sex1 = "women";
      }
      fun1()
      //   console.log(sex);//not defined
      console.log(sex1);

      

      //   块级作用域:被块级变量所拥有,在分支语句或循环大括号中定义的变量。
      //   一般一个花括号{}为一个代码块
      //   块级变量:let关键字声明的变量。
      for (let i = 0; i < 5; i++) {
        console.log("循环内部" + i);
      }
      console.log("循环外部" + i); // not defined
    </script>
  </body>

定时器函数

  <body>
    <script>
       setTimeout(() => {
            console.log("会呼吸的痛");
        },  3000);
        // setTimeout(() => {}, timeout);
        // 用来设置某个函数在多少毫秒之后执行
 
      setInterval(() => {
            console.log("想念是");
        }, 3000);
        // setInterval(()=>{},interval);
        // 用来设置某个函数在多少时间间隔后反复执行
 

      console.log(1);
      console.log(2);
      console.log(3);
      setTimeout(() => {
         console.log(4);
      }, 3000);
      console.log(5);
    //   12354

    // 定时器函数是异步代码,需要等全部同步代码执行完执行。
     
    </script>
  </body>

嵌套函数与作用域链

  <body>
    <script>
      var i = 10; //i是全局变量,全局变量可以在函数内外被访问到.

      let n = 30;

      function fu1() {
        console.log(i); //函数内可以访问到全局变量i

        let n = 20; // n被声明在函数内部,属于函数变量

        console.log(n); //n是函数变量,在函数作用域里可以拿到n的值,
      }

      console.log(i); //函数外也可以访问到全局变量i

      //console.log(n);//函数外部拿不到函数内部声明的变量

      console.log(n); //函数外可以取得全局变量n的值

      fu1();

      function fn2() {
        let n = 40;
        console.log(n); //当既有全局变量n,又有局部变量n,就近取值。
        // console.log(n);//在函数内部可以拿到12行n的值
      }
      fn2();


      

      //【函数嵌套与作用域链】
      var i = 10;
      function fn1() {
        var i = 20;
        function fn2() {
          function fn3() {
            console.log(i); //20
          }
          fn3();
        }
        fn2();
      }
      fn1();
      //变量访问规则:就近原则
      //当在一个作用域中访问变量时,首先看当前作用域有没有声明。
      //如果有则访问,没有则往上级作用域查找。
      //直到达到顶端作用域没有时,程序报错。
    </script>
  </body>

闭包函数

闭包(close)函数;是一种代码形式,内部函数访问外部函数的局部变量

        // 举例;js函数outer中有一个函数inner

        // 函数inner访问了函数outer定义的局部变量demo,此时就产生了闭包

网页计算器

  <body>
    <p>整数1:<input type="text" id="num1" /></p>

    <p>整数2:<input type="text" id="num2" /></p>
    <p>
      <!-- onclick="function"
        onclick 表示按钮点击事件,当点击按钮时,就会执行function函数内容 -->
       <input type="button" value="相加" onclick="  cal(add) " />
      <input type="button" value="想减" onclick="  cal(sud) " />
      <input type="button" value="相臣" onclick="  cal(mul) " />
      <input type="button" value="相厨" onclick="  cal(div) " />
    </p>
    <p>结果:<input type="text" id="result"></p>

    <script>
        // 在函数cal中,需要传入一个参数函数func
         function cal(func) {
            // document.getElementById ;在JS中通过id获取HTML中的元素
            
            // var num1 = document.getElementById("num1").value
            var num1 = parseInt(document.getElementById("num1").value)
            // var num2 = document.getElementById("num2").value
            var num2 = parseInt(document.getElementById("num2").value)

            var result = document.getElementById("result")
            result.value = func (num1,num2)

        }

      function add(num1, num2) {
        return num1 + num2;
      }
      function sud(num1, num2) {
        return num1 - num2;
      }
      function mul(num1, num2) {
        return num1 * num2;
      }
      function div(num1, num2) {
        if (num2 === 0) {
            alert("被除数不为0")
        }
        return num1 / num2;
      }
    </script>
  </body>

递归函数

//   递归写法

    function getSum2(params) {

        // 当n=1时

        if (n==1) {

            return 1

           

        }

        return n +getSum2(n-1)

    }

        // 递归过程

        // getSum = 5

        // return 5+getSum2(4)

        // return 5 + 4 + getSum2(3)

        // return 5 +4 + 3 + getSum2(2)

        // rerurn 5 +4 + 3 + 2 + getSum2(1)

        //rerurn5+4+3+2+1=15

       

        console.log(getSum2(7));

        //【递归函数】

        // 一个函数间接或直接地调用自身

        function fun(){

            console.log(1);

            fun()

         }

第五章-对象

介绍对象

对象:(object)是一种复杂数据类型。

      //(简单数据类型存储在栈中。复杂数据类型的内容存储在栈中,地址存储在堆中。)

      //对象形式:以键值对的形式存储多个数据

1.使用简单数据类型存储数据

      let name = "张三";

      let age = 18;

      let sex = "men";

      // 弊端;冗余。 好处:阅读性高。

 2.数组

      let people = ["张三", 18, "'man"];

      // 弊端:阅读性不高。

3.对象

      let obj = {

        name: "张三",

        sex: "man",

        age: 18,

        gfs: ["张田中", "小妹", "小狗"],

        func:function(){

            console.log("一见爱桑个");

        }

      };

3.1查询对象

        console.log(obj);  

        console.log(obj.name);  

        console.log(obj.sex);  

        console.log(obj.age);  

        console.log(obj.gfs);  

        console.log(obj.func);   //查询函数

        console.log(obj.func());   //执行函数

3.2对象新增

        obj.bf = "李斯"

        console.log(obj);

3.3对象修改

        // 如果对象原有属性名是修改,没有则是新增。

        obj.bf = "万物"

        console.log(obj);

3.4对象删除

        delete obj.gfs

        console.log(obj);

Math对象

<body>
    <script>
        // 1.内置对象:由JS作者提交编写好的对象,直接使用即可。

        // 需求
        // 已知边长r=5,求圆的周长
        const pi = 3.14;
        const  r = 5;
        const  C = 2*pi*r;
        console.log(C);

        // a.圆周率:Math.PI
        console.log(Math.PI);
        const c=2 *Math.PI *r
        console.log(c);

        //b.绝对值:Math.abs()
        console.log(Math.abs(-3));//3
        console.log(Math.abs(3));//3

        //c.求最大/最小值:Math.max()/ Math.min()
        console.log(Math.max(5,7,2,9,0,3,-1));//9
        console.log(Math.min(5,7,2,9,0,3,-1));//-1

        // d.四舍五入:Math.round()
        console.log(Math.round(3.3));//3
        console.log(Math.round(-3.3));//-3
        console.log(Math.round(-3.6));//-4

        // f.向上取整:Math.ceil()
        console.log(Math.ceil(1.4));// 2
        console.log(Math.ceil(-1.4));//-1

        // g.向上取整:Math.floor()
        console.log(Math.floor(1.4));// 1
        console.log(Math.floor(-1.4));//-2

        //h.生成一个0-1之间的随机小数:Math.random()
        console.log(Math.random());
        console.log(Math.random());
        
        //生成一个0-100之间的随机整数
        console.log(Math.random()* 100);
        console.log(Math.round(Math.random()* 100));


        const w =Math.floor(Math.random() * 101); // 生成0到100之间的随机整数
        console.log(w);
    </script>
</body>

Date对象

 //时间戳:1970年1月1日0点到现在的毫秒数console.log(new Date().getTime())
 // 获取年份
 console.log(new Date().getFullYear());// 2024
 //获取月份
 console.log(new Date().getMonth());//范围是0-11
 // 获取日期
 console.log(new Date().getDate());//22
 // 获取星期
 console.log(new Date().getDay());//范围是0-6 0是星期天// 获取小数
 console.log(new Date().getHours());//17// 获取分钟
 console.log(new Date().getMinutes());//11
 // 练习:在页面中显示“今天是2024年5月22日,星期三
 // 练习:在页面中显示“1998年8月1日,我出生了”
 var date = new Date()
 // 设置年份
 date.setFullYear(1998)
 // 设置月份
 date.setMonth(8)
 date.setDate(1)
 // 打印月份
 console.log(date.getFullYear());

Array对象

<body>
    <script>
        var course =["web" ,"java" ]

        // push():在数组末尾添加元素
        course.push("JS")
        console.log(course);//['web','java','Js']

        //unshift():在数组前添加元素
        course.unshift("计算机基础")
        console.log(course);//['计算机基础,'web', 'java', 'JS']

        //pop():删除数组中最后一个元素
        course.pop()
        console.log(course);//['计算机基础’,'web','java']
            
        //shift():删除数组中第一个元素
        course.shift()
        console.log(course); //['web', 'java' ] - ['web' ,"JS" ,"Vue" ,"node" ]

        var arr =[1,2,3,4,5,6,7]
        //splice(startIndex,deleteCount)splice(起始下标、删除的树木)
        arr.splice(3,3)// 表示从下标3(数字4)开始,删掉3个数字。
        console.log(arr);//[1,2,3,7]
        arr.splice(2,2)
        console.log(arr);//[1,2]
        //splice(startIndex,deleteCount,addItem1,addItem2,addItem3)
        arr.splice(2,0,3,4,5,6,7)
        console.log(arr);//[1,2,3,4,5,6,7]
        //删掉课程java,添加课程“JS、Vue、Node”
        course.splice(1,1,"JS" ,"Vue" ,"Node" )
        console.log(course)//['web', 'JS', 'Vue', 'Node']

        // reverse():颠倒数组中元素的索引
        arr.reverse()
        console.log(arr);//[7, 6, 5, 4, 3, 2, 1]

        var demo = [23,65,78,9,13,7,24,35]

        // sort()对数组进行排序
        //升序排序
        demo.sort(function(a,b){
            return a-b 
        })
        console.log(demo);//[7, 9, 13, 23, 24, 35, 65, 78]

        // 降序排序
        demo.sort(function(a,b){
            return b-a
        })
        console.log(demo);//[78, 65, 35, 24, 23, 13, 9, 7]njnikopj

        //获取数组元素索引的方法
        var student =["张三","李四","王五","裘月峰","张三"]
        // indexOf(element):返回指定第一个元素的下标,没有则返回-1
        console.log(student.indexOf("李四"));//1
        console.log(student.indexOf("慢羊羊"));//-1
        // lastIndexOf(element):返回指定第一个元素在数组中最后一次出现的下标,没有则返回-1
        console.log(student.lastIndexOf("张三"));//4
        
        // 将数组转化为字符串
        // toString()用逗号分隔数组中每个元素,不会改变原数组
        // join() 将数组中所有元素连接成一个字符串,默认用逗号隔开。
        console.log(student.toString());//张三,李四,王五,裘月峰,张三
        console.log(student);//['张三’,'李四’,'王五’,'裘月峰',"张三']
        console.log(student.join());//张三,李四,王五,裘月峰,张三
        console.log(student.join(""));//张三李四王五裘月峰张三
        console.log(student.join("-"));//张三-李四-王五-裘月峰-张三
        console.log(student.join("/"));//张三/李四/王五/裘月峰/张三
        console.log(student.join("S"));//张三S李四S王五S裘月峰S张三
            
            
        //数组类型检测
        console.log(Array.isArray(student));//true
        var obj ={
        name:"张三"
        }
        console.log(Array.isArray(obj));//false

    </script>
</body>

String对象

        var str = "helloworld"

        console.log(str.length);//10

        // 根据字符串返回下标(索引)

        // indensOf()返回元素在字符串中第一次出现的下标,没有则是-1

        // lastIndexOf()返回元素在字符串中最后一次出现的下标,没有则是-1

        console.log(str.indexOf("o"));//4

        console.log(str.lastIndexOf("o"));//6

        console.log(str.lastIndexOf("v"));//-1

第六章DOM

DOM允许开发者通过创建、修改或删除HTML元素来与网页交互

1. **获取元素**:
- `getElementById(id)`:根据ID获取元素。
- `getElementsByClassName(className)`:根据类名获取元素集合。
- `getElementsByTagName(tagName)`:根据标签名获取元素集合。
- `querySelector(selector)`:根据CSS选择器获取第一个匹配的元素。
- `querySelectorAll(selector)`:根据CSS选择器获取所有匹配的元素集合。
2. **创建元素**:
- `document.createElement(tagName)`:创建一个新的元素。
- `document.createTextNode(text)`:创建一个包含文本的新文本节点。
3. **添加、删除和替换元素**:
- `appendChild(node)`:将新节点添加到父节点的子节点列表末尾。
- `insertBefore(newNode, referenceNode)`:在参考节点之前插入新节点。
- `removeChild(node)`:从父节点中删除指定的子节点。
- `replaceChild(newNode, oldNode)`:用新节点替换旧节点。
4. **属性操作**:
- `element.getAttribute(name)`:获取元素的属性值。
- `element.setAttribute(name, value)`:设置元素的属性值。
- `element.removeAttribute(name)`:删除元素的属性。
5. **事件处理**:
- `addEventListener(eventName, eventHandler)`:为元素添加事件监听器。
- `removeEventListener(eventName, eventHandler)`:移除事件监听器。
6. **事件冒泡和事件捕获**:
- 事件不仅可以在目标元素上触发,还可以沿着DOM树向上(冒泡)或向下(捕获)传播。
- `event.stopPropagation()`阻止事件继续冒泡。
- `event.stopImmediatePropagation()`阻止同一事件的其他监听器执行。
7. **事件委托**:
- 使用事件冒泡,可以在父元素上监听事件,然后通过`event.target`判断哪个子元素触发了事件,以此来减少事件监听器的数量。
8. **文档碎片(DocumentFragment)**:
- `document.createDocumentFragment()`用于创建一个临时的DOM片段,可以用于高效地批量添加或删除元素。
9. **遍历和查询**:
- `previousElementSibling`和`nextElementSibling`属性用于获取元素的前一个或后一个兄弟元素。
- `parentElement`属性获取元素的直接父元素。
- `childNodes`和`children`分别返回元素的所有子节点(包括文本节点)和所有子元素。
10. **样式操作**:
- `style`属性允许直接操作元素的内联样式。
- `getComputedStyle(element)`返回元素的计算样式,包括浏览器应用的默认样式和继承样式。
11. **动画和过渡**:
- 通过修改元素的CSS属性,如`transform`和`opacity`,可以创建动画效果。
12. **表单元素操作**:
- DOM API提供了处理表单元素的方法,如`element.value`获取或设置表单字段的值,`element.checked`检查复选框或单选按钮是否被选中。
13. **XMLHttpRequest和Fetch API**:
- 与DOM交互时,这些API用于向服务器发送请求并处理响应,从而实现动态加载数据。
14. **MutationObserver**:
- 用于监听DOM的变化,如元素的添加、删除或属性更改。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值