JS基础学习------四

100 阅读6分钟

数组应用

根据数组元素生成手风琴

手风琴效果

手风琴效果图.png 首先是css样式

        .box{
            width: 1120px;
            height: 260px;
            margin: 50px auto;
            display: flex;
            overflow: hidden;
        }

        .box>div{
            width: 120px;
            border: 1px solid #fff;
            transition: all 0.5s;
        }

        .box>div:hover{
            width: 400px;
        }

思路---遍历arr数组,按要求生成页面结构,在循环体内生成div以及img,并将数组的数据设置给img的src属性。

模拟后台返回的数据

        let arr = [
            './images/1.jpg',
            './images/2.jpg',
            './images/3.jpg',
            './images/4.jpg',
            './images/5.jpg',
            './images/6.jpg',
            './images/7.jpg',
        ]
        let strHTML = '<div class="box">'
        for(let i=0; i< arr.length; i++){            
            strHTML += `<div><img src="${arr[i]}"></div>`
        }
        strHTML += '</div>';

        document.write(strHTML)

首先定义一个变量,将手风琴结构的整体box放入其中。 在通过for循环遍历整个arr数组,已达到读取图片路径的目的,代码如上。

根据数组元素生成柱状图

柱状图效果

柱状图效果图.png 首先是css样式:

      .box {
        width: 1000px;
        height: 400px;
        border-left: 1px solid #000;
        border-bottom: 1px solid #000;
        margin: 50px auto;
        /* 父元素伸缩盒子 */
        display: flex;
        /* 水平方向均匀分布 */
        justify-content: space-around;
        /* 垂直方向底部对齐 */
        align-items: flex-end;
      }
      .box > div {
        width: 50px;
        height: 100px;
        background-color: pink;
        text-align: center;
        font-size: 14px;
        /* 伸缩盒子 */
        display: flex;
        /* 修改伸缩盒子主轴为垂直方向 */
        flex-direction: column;
        /* 修改主轴方向两端对齐 */
        justify-content: space-between;
      }
      .box > div span {
        margin-top: -20px;
      }
      .box > div h3 {
        margin-bottom: -40px;
      }

然后定义一个数组模拟返回后台的数据

        let month = [100, 120, 230, 110, 300, 260, 130, 90, 300, 200, 150, 80];

        let strHTML = '<div class="box">'
        for(let i=0; i<month.length; i++){
          // month[i]
          strHTML += `<div style="height:${month[i]}px">
              <span>${month[i]}</span>
              <h3>${i+1}月</h3>
            </div>`;
        }
        strHTML += '</div>';

        document.write(strHTML)

定义一个变量 strHTML,将数组中的顺序i作为月数,利用css的层叠性将数据添加在css样式内的高度。

冒泡排序法

需求,将一个数组从小到大重新排序。 利用c=a a=b b=c的方法实现。

首先定义一个数组

let arr = [ 9, 5, 3, 8, 17, 6];

先实现大小对比后交换位置,再实现for循环单个一轮达成将最大的放到最后,最后实现整个数组重新排序(for外循环)

      // 外层循环控制找几次最大的
      for (let j = 1; j < arr.length; j++) {
        // 内层:最大的放在后面
        // i 与 i+1  相邻的两个数
        for (let i = 0; i < arr.length - j; i++) {
          // 如果前面的比后面的大,就交换位置
          if (arr[i] > arr[i + 1]) {
            let c = arr[i];
            arr[i] = arr[i + 1];
            arr[i + 1] = c;
          }
        }
      }
      console.log(arr);

求数组中的最大值

  • 第一步,定义一个变量将数组的0号元素赋值给这个变量 let table = arr[0]
  • 第二步,从1号下标开始遍历数组
  • 第三步,如果遍历到元素比table里的值大,将替换掉table里的值
      let table = arr[0];
      for (let i = 1; i < arr.length; i++) {
        if (arr[i] > table) {
          table = arr[i];
        }
      }
      console.log(table);

函数

函数的定义与调用

首先,变量是用于存储数据的。 那么函数的作用类似,是用于存储代码的,可以实现一次定义多处调用。

函数的定义:

    function 函数名(){
        //函数体
      function fn() {
        let str = '<table border="1" rules="all" width="700" height="500">';
        for (let row = 1; row < 10; row++) {
          str += "<tr>";
          for (let col = 1; col <= row; col++) {
            str += `<td>${col}*${row}=${col * row}</td>`;
          }
          str += "</tr>";
        }
        str += "</table>";
        document.write(str);
      }

上述代码定义了一个名为fn的函数。代码在函数内部的时候,默认并不会自动执行。诺要执行,需要调用,方法如下。

fn()

调用可以重复任意数量。

函数的调用案例

需求~封装一个函数,函数内部实现两个求和

        function fn(){
            let a = 10;
            let b = 20;
            let ret = a + b;
            console.log(ret);
        }
        fn();

函数的参数

形参与实参

定义:形参是在函数定义量的参数,下述代码中X,Y即为形参

       function fn(x, y){
            // console.log(x,y);
            let ret = x + y;
            console.log(ret)
        }

定义:函数调用时的参数是实参,实参可以变量,也可以是具体的值。

let n = 10;
fn(n,20); 
fn(100,200);

小结:函数的参数就是将函数外部数据传递到函数内部进行运算。

tips!
  • 实参与形参之间是按顺序传递的
  • 形参就是一个变量,只在函数内部访问
  • 参数可以是任何类型

函数参数-案例

需求~封装一个函数,要求是可以对任何一个数组求最大值

      function getMax(arr) {
        let table = arr[0];
        for (let i = 1; i < arr.length; i++) {
          if (arr[i] > table) {
            table = arr[i];
          }
        }
        console.log(table);
      }
      getMax([4, 39, 10, 29]);
      getMax([100, 29, 387, 58]);

这样封装后,调用使用时,实参是任意一个数组都可以将其最大值求出。

函数的返回值

return作用就是将函数内部的数据返回到函数外部

      function fn() {
        // 使用a模拟函数内部定义的一个变量
        let a = 10;
        // 函数的内部的数据只能在函数内部访问
        return a;
      }
      let ret = fn();
      console.log(ret);

小结:return 将函数内部的数据返回到函数外部,外部想使用必须使用接收。

函数的返回值 tips!
  • 函数内部只要遇到return就会中断函数的执行
  • return后也可以不写数据,目的就是为了中断运行
  • 函数内部想返回多个数据
  • return返回的数据可以使任何类别。number、string、boolean、undefined、null、array...等等
      function fn() {
        console.log("hello");
        return [10, 20];
        console.log("world");
      }

      let ret = fn();
      console.log(ret);

函数的返回值 - 案例

封装一个函数:功能---在一个数组中查找是否有某个元素存在,如果存在则返回true

      function find(arr, target) {
        for (let i = 0; i < arr.length; i++) {
          if (arr[i] == target) {
            return true;
          }
        }
      }
      let stus = ["zhangsan", "lisi", "wangwu", "zhaoliu", "tianqi"];
      let na = "lisi";
      let ret = find(stus, na);
      console.log(ret);

作用域

作用域简介

  • 在JS中,作用域可以分为三种。

  • 全局:在函数之外就是全局

  • 全局变量:在全局定义的变量就是全局变量

  • 局部:在函数内部的就是局部

  • 局部变量:在局部定义的变量就是局部变量

  • 块级:只要语法中具有{}都是块级作用域

      // 全局变量
      let a = 10;
      function fn() {
        // 局部变量
        let b = 20;
      }

变量的访问范围

全局变量:访问不受限制 局部变量:局部变量只能在定义的函数内访问

      // 全局变量
      let a = 10;
      function fn() {
        // 局部变量
        let b = 20;
        // 尝试在局部访问全局变量a
        // console.log(a);
        // console.log(b);
      }
      fn();
      // 尝试在全局访问局部变量b
      console.log(b); // 报名无法访问
      // console.log(a);

块级作用域

  • 只要语法中具有{}都会形成一个块级作用域
  • 块级作用域只影响let声明的变量
  • var 也是用于声明变量
        // let a = 10;
        // var b = [10,20];
        // console.log(a,b);
        // var与let的区别,主要体现在块级作用域上
        // {
        //     var y = 20;
        //     let x = 10;
        // }
        // console.log(y);     // 20
        // console.log(x);     // 报错

        // console.log(n);
        // var n = 20;

        // let m = 10;
        // console.log(m);
  • let声明的变量必须先定义后使用
  • 不推荐直接为变量赋值的方式定义变量,推荐使用let
        age = 20;
        console.log(age);

小结:let声明受块级作用域限制 var也是用于声明变量的,var声明的变量不受块级作用域的限制。

作用域链以及链式查找

  • 作用域链:由嵌套的作用域形成的一个链条
  • 链式查找:当在某个作用域内使用一个变量时,如果这个变量不存在,会进而向上一级作用域查找此变量。
      // let a = 10
      function fn() {
        // let a = 100
        function fn1() {
          // let a = 1000
          function fn2() {
            console.log(a);
          }
          fn2();
        }
        fn1();
      }
      fn();

案例分享

需求~查找数组中是否有某个元素存在,查找这个数组中是否有14这个数存在。如果有就输出 'yes';

      let arr1 = [1, 2, 3, 4, 56, 7, 8, 9, 10];
      function find1(arr, a) {
        for (let i = 0; i < arr.length; i++) {
          if (arr[i] == a) {
            return "yes";
          }
        }
      }
      let b = 10;
      let rect = find1(arr1, b);
      console.log(rect);

案例分享

需求~查找数组中某个元素不存在,校验 'txt'不在数组 ['jpg','jpeg','png','pjpeg'] 中,如果不存就输出no

      function find(arr, a) {
        let f = 0;
        for (let i = 0; i < arr.length; i++) {
          if (arr[i] != a) {
            f++;
          }
        }
        if (f == arr.length) {
          return "no";
        }
      }
      let a = ["jpg", "jpeg", "png", "pjpeg"];
      let b = [`txt`];
      let rect = find(a, b);
      console.log(rect);

over-------------------- 代码学习不易我们一起加油,共勉