6-js基础-3

news2024/12/24 8:09:20

JavaScript 基础 - 3

知道什么是数组及其应用的场景,掌握数组声明及访问的语法,具备利用数组渲染柱形图表的能力

今日重点:

  • 循环嵌套
  • 数组
  • 综合案例

今日单词:

在这里插入图片描述

循环嵌套

利用循环的知识来对比一个简单的天文知识,我们知道地球在自转的同时也在围绕太阳公转,如果把自转和公转都看成是循环的话,就相当于是循环中又嵌套了另一个循环。

在这里插入图片描述

实际上 JavaScript 中任何一种循环语句都支持循环的嵌套,如下代码所示:

基本语法:

for(初始化; 循环条件;变量计数) {
  for (初始化; 循环条件;变量计数){
    //  要重复执行的代码
  }
}

例如:

// 1. 外面的循环 记录第n天 
for (let i = 1; i < 4; i++) {
    document.write(`第${i}天 <br>`)
    // 2. 里层的循环记录 几个单词
    for (let j = 1; j < 6; j++) {
        document.write(`记住第${j}个单词<br>`)
    }
}

记住,外层循环循环一次,里层循环循环全部

三角型

 // 外层打印几行
for (let i = 1; i <= 5; i++) {
    // 里层打印几个星星
    for (let j = 1; j <= i; j++) {
        document.write('★')
    }
    document.write('<br>')
}

在这里插入图片描述

九九乘法表

样式css

span {
    display: inline-block;
    width: 100px;
    padding: 5px 10px;
    border: 1px solid pink;
    margin: 2px;
    border-radius: 5px;
    box-shadow: 2px 2px 2px rgba(255, 192, 203, .4);
    background-color: rgba(255, 192, 203, .1);
    text-align: center;
    color: hotpink;
}

javascript

 // 外层打印几行
for (let i = 1; i <= 9; i++) {
    // 里层打印几个星星
    for (let j = 1; j <= i; j++) {
        // 只需要把 ★ 换成  1 x 2 = 2   
        document.write(`
				<div> ${j} x ${i} = ${j * i} </div>
     `)
    }
    document.write('<br>')
}

在这里插入图片描述

数组

知道什么是数组及其应用的场景,掌握数组声明及访问的语法。

数组是什么?

数组:(Array) 是一种数据类型,属于引用数据类型

作用: 在单个变量名下存储多个数据

例如我要保存咱们班同学的姓名,使用数组非常方便

数组的基本使用

定义数组

<script>
  // 1. 语法,使用 [] 来定义一个空数组
  // 定义一个空数组,然后赋值给变量 classes
  // let classes = []

  // 2. 定义非空数组
  let classes = ['小明', '小刚', '小红', '小丽', '小米']
</script>

通过 [] 定义数组,数据中可以存放真正的数据,如小明、小刚、小红等这些都是数组中的数据,我们这些数据称为数组单元,数组单元之间使用英文逗号分隔。

访问数组和数组索引

使用数组存放数据并不是最终目的,关键是能够随时的访问到数组中的数据(单元)。其实 JavaScript 为数组中的每一个数据单元都编了号,通过数据单元在数组中的编号便可以轻松访问到数组中的数据单元了。

我们将数据单元在数组中的编号称为索引值,也有人称其为下标。

索引值实际是按着数据单元在数组中的位置依次排列的,注意是从 0 开始的,如下图所示:

在这里插入图片描述

观察上图可以数据单元【小明】对应的索引值为【0】,数据单元【小红】对应的索引值为【2】

<script>
  // 数组: 可以单个变量下存储多个数据
  // 1. 声明数组
  let names = ['小明', '小刚', '小红', '小丽', '小米']
  // let names = ['小明', '小刚', true, '小丽', 1]
  console.log(names)
  // 1.1 数组是按照顺序来存储的,每个数据都有自己的编号
  // 1.2 编号是从0开始的, 0 1 2 3... 也称为 索引 或者 下标
  // 1.3 数组里面可以存放任意的数据类型

  // 2. 数组取值  数组名[下标]
  console.log(names[0])  // '小明'
  console.log(names[1])  // '小刚'
  console.log(names[2])  // '小红'
  console.log(names[3])  // '小丽'
  console.log(names[4])  // '小米'
</script>

数组做为数据的集合,它的单元值可以是任意数据类型

<script>
  // 6. 数组单值类型可以是任意数据类型

  // a) 数组单元值的类型为字符类型
  let list = ['HTML', 'CSS', 'JavaScript']
  // b) 数组单元值的类型为数值类型
  let scores = [78, 84, 70, 62, 75]
  // c) 混合多种类型
  let mixin = [true, 1, false, 'hello']
</script>

遍历数组

遍历数组:把数组中每个数据都访问到

数组长度: 数组.length

<script>
  let arr = ['迪丽热巴', '古力娜扎', '佟丽丫丫', '玛尔扎哈', '哈尼克孜']
  // console.log(arr[0])
  // console.log(arr[1])
  // console.log(arr[2])
  // console.log(arr[3])
  // 遍历数组: 把数组里面的数据每个都会访问到
  // for (let i = 0; i < 4; i++) {
  //   // console.log(i)  数组名[索引号]
  //   console.log(arr[i])
  // }

  // 1. 数组的长度 数组.length 
  // console.log(arr.length)  // 4
  for (let i = 0; i < arr.length; i++) {
    console.log(arr[i])
  }
  // 2. 数组里面的数据也称为 数组元素
</script>

操作数组

数组本质是数据集合, 操作数据无非就是 增 删 改 查 语法

在这里插入图片描述

查询和修改数组

查询:

​ 语法:数组[索引]

​ 返回值:如果查询不到则返回 undefined

修改:

​ 语法:数组[索引] = 新值

​ 返回值:如果下标不存在,则是新增一个数组元素,并修改了数组长度(尽量避免)

<script>
  // 1. 查询数组元素
  let arr = ['迪丽热巴', '古丽扎娜']
  console.log(arr[0]) //  '迪丽热巴'
  console.log(arr[1]) //  '古丽扎娜'
  console.log(arr[2]) //  undefined

  // 2. 修改数组元素   数组[索引] = 新值
  arr[1] = '佟丽丫丫'
  // console.log(arr)
  arr[3] = '古丽扎娜'  // 如果索引号不存在,则是增加数组元素 (不提倡)
  console.log(arr)
  console.log(arr.length)  // 4 修改了数组长度
</script>

新增

在这里插入图片描述

// 数组新增元素
// 1. 可以向数组的末尾新增1个或者多个数组元素 数组.push(元素1...元素n)
let arr = ['迪丽热巴']
// console.log(arr.push('佟丽丫丫'))  // 返回的是新数组的长度 2
// arr.push('佟丽丫丫', '古丽扎娜')
// console.log(arr)  // 修改原数组

// 2. 可以向数组的开头增加1个或者多个数组元素 数组.unshift(元素1,...元素n)
// console.log(arr.unshift('佟丽丫丫'))  // 返回的是新数组的长度 2
arr.unshift('佟丽丫丫', '古丽扎娜')
console.log(arr) // 修改原数组

删除

在这里插入图片描述

<script>
  // 删除元素
  // 1. 删除数组中的最后一个元素  数组.pop()  修改原数组
  let arr = ['red', 'green']
// arr.pop()
// console.log(arr.pop())  // 返回的是被删除的元素
// console.log(arr)

// 2. 删除数组中的第一个元素 数组.shift() 修改原数组的
arr.shift()
// console.log(arr.shift())  // 返回的是被删除的元素
console.log(arr)
</script>

数组 splice方法

数组.splice() 方法 可以添加也可以删除数组元素

说明:可以从指定位置删除或者增加的数组元素,注意它修改原数组

splice(start,deleteCount, item1, item2…)

  1. start 起始位置:

    • 指定修改的开始位置(从0计数)
  2. deleteCount 删除个数:

    • 表示要移除的数组元素的个数

    • 可选的。如果省略则默认从指定的起始位置删除到最后

  3. item1, item2…

    • 新增的元素
<script>
  // splice 删除和增加数组元素
  let arr = ['迪丽热巴', '古力娜扎', '佟丽丫丫', '玛尔扎哈']
// 1. splice 删除  数组.splice(起始位置, 删除几个)
// arr.splice(1, 1) // 记住起始位置是索引号,从0 开始数
// arr.splice(1) // 如果第二个参数(删除几个)省略了,则默认删除到最后
// console.log(arr)

// 2. splice 增加  数组.splice(起始位置, 删除几个, 新增元素1,...新增元素n)
arr.splice(1, 0, '刘德华', 'pink老师')
// 2.1 注意如果是新增,则起始位置是目标位置的索引号, 删除几个(第二个参数)不能省略我们写为 0, 后面写新增的元素
console.log(arr)

// 3. splice 不是替换pop shift  unshift push.  arr.splice(0, 1)
// 开头结尾找前面 pop shift  unshift push
// splice管中间
</script>

综合案例

手风琴效果

在这里插入图片描述

小技巧: 利用循环拼接字符串 (原理跟累加和类似)

①:声明一个空的字符串 str = ‘’

②:循环里面利用 += 进行拼接

③:把拼接完毕的字符串放入容器中

完整代码:


<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
  <style>
    .box {
      display: flex;
      overflow: hidden;
      width: 1120px;
      height: 260px;
      margin: 50px auto;
    }

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

    .box>div:hover {
      width: 400px;
    }
  </style>
</head>

<body>
  <!-- <div class="box">
    <div><img src="./images/1.jpg" alt=""></div>
    <div><img src="./images/2.jpg" alt=""></div>
    <div><img src="./images/3.jpg" alt=""></div>
    <div><img src="./images/4.jpg" alt=""></div>
    <div><img src="./images/5.jpg" alt=""></div>
    <div><img src="./images/6.jpg" alt=""></div>
    <div><img src="./images/7.jpg" alt=""></div>
  </div> -->

  <script>
    let arr = [
      './images/1.jpg',
      './images/2.jpg',
      './images/3.jpg',
      './images/4.jpg',
      './images/5.jpg',
      './images/6.jpg',
      './images/7.jpg',
    ]

    // 1. 声明一个空的字符串变量 str 
    let str = ''

    // 2. 利用for循环拼接字符串 +=
    for (let i = 0; i < arr.length; i++) {
      // console.log(arr[i])
      str += `
      <div><img src="${arr[i]}" alt=""></div>
      `
    }
    console.log(str)

    // 3. 把拼接的字符串放入 box盒子里面
    document.write(`
      <div class="box">
        ${str}
      </div>
    `)

  </script>
</body>

</html>

根据数据渲染柱形图效果

在这里插入图片描述

需求:用户输入四个季度的数据,可以生成柱形图

分析:

①:需要输入4次,所以可以把4个数据放到一个数组里面

  • 声明一个空数组
  • 利用循环,弹出4次框,同时把数据存到数组里面

②:遍历该数组,根据数据生成4个柱形图,渲染打印到页面中

  • 声明一个空字符串str
  • 根据数组利用循环拼接字符串,生成多个柱子
  • 把生成的柱子添加到box盒子中

完整代码:


<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    * {
      margin: 0;
      padding: 0;
    }

    body {
      background-color: #0c143d;
    }

    .box {
      display: flex;
      justify-content: space-around;
      align-items: flex-end;
      width: 800px;
      min-height: 300px;
      border-left: 1px solid #4b578f;
      border-bottom: 1px solid #4b578f;
      margin: 0 auto;
      padding-top: 50px;
      text-align: center;
      color: #9799ab;
    }

    .box>div {
      position: relative;
      display: flex;
      flex-direction: column;
      justify-content: space-between;
      width: 40px;
      height: 0;
      background: linear-gradient(#3c99ff, #4489d0, #2283e4);
      cursor: pointer;
      border-radius: 8px 8px 0 0;
      transition: all .2s;
    }

    .box>div:hover {

      animation: bg .5s alternate infinite;

    }

    @keyframes bg {
      to {
        box-shadow: 0 5px 29px rgb(53 111 226 / 88%);
        background: linear-gradient(#3c99ff, #68aff6, #2283e4);
      }
    }

    .box>div::after {
      content: '';
      position: absolute;
      bottom: 0;
      left: 50%;
      width: 2px;
      height: 10px;
      background-color: #4b578f;
      transform: translate(-50%, 100%);
    }

    .box div span {
      width: 60px;
      margin: -30px 0 -5px -6px;
    }

    .box div h4 {
      width: 70px;
      margin: 0 0 -35px -10px;
    }

    .title {
      margin-top: 50px;
      text-align: center;
      color: #9799ab;
    }
  </style>
</head>

<body>
  <h3 class="title">2099年季度销售数额(单位万)</h3>
  <!-- <div class="box">
    <div style="height: 123px;" title="第1季度-123万">
      <span>123</span>
      <h4>1季度</h4>
    </div>
    <div style="height: 156px;" title="第2季度-156万">
      <span>156</span>
      <h4>2季度</h4>
    </div>
    <div style="height: 120px;" title="第3季度-120万">
      <span>120</span>
      <h4>3季度</h4>
    </div>
    <div style="height: 210px;" title="第4季度-210万">
      <span>210</span>
      <h4>4季度</h4>
    </div>
  </div> -->
  <script>
    // 功能1: 用户输入4次,并且把数据存放到数组里面

    // 1.1 声明一个空的数组
    let arr = []

    // 1.2 利用循环的形式让用户输入4次,并且把数据追加给数组
    for (let i = 1; i <= 4; i++) {
      let num = +prompt(`请您输入第${i}季度的销售额`)
      arr.push(num)
    }
    console.log(arr)

    // 功能2:根据数组生成柱形图

    // 2.1 声明一个空的字符串 str
    let str = ''

    // 2.2 利用循环拼接字符串,生成多个柱子
    for (let i = 0; i < arr.length; i++) {
      str += `
        <div style="height: ${arr[i]}px;" title="第${i + 1}季度-${arr[i]}万">
          <span>${arr[i]}万</span>
          <h4>第${i + 1}季度</h4>
        </div>
      `
    }
    console.log(str)

    // 2.3 把生成的柱子放到box盒子里面进行渲染
    document.write(`
      <div class="box">
        ${str}
      </div> 
    `)
  </script>
</body>

</html>

拓展知识

数组排序sort

数组. sort() 方法可以排序

语法:

<script>
    // 数组排序  数组.sort()  修改原数组
    let arr = [88, 78, 100, 34, 99]
    // arr.sort()
    // console.log(arr)  // [100, 34, 78, 88, 99]

    // 1. 升序排序
    // arr.sort(function (a, b) {
    //   return a - b
    // })
    // console.log(arr)  // [34, 78, 88, 99, 100]

    // 2. 降序排序
    arr.sort(function (a, b) {
      return b - a
    })
    console.log(arr)  //  [100, 99, 88, 78, 34]

    // 3. 获取数组最大值和最小值
    document.write(`数组的最大值:${arr[0]}`)
    document.write(`数组的最小值:${arr[arr.length - 1]}`)
  </script>

选择排序(了解)

选择排序原理:(了解)

就是从第一个数开始,与后面所有的数相比较,找出最小(最大)的数,放在第一个位置

以此类推,每一轮确定一个相对于这一轮最小(最大)的数

算法可视化网站地址: https://visualgo.net/zh/sorting

核心:利用循环嵌套比较,根据索引号来交换变量

①:外层循环是一共进行几轮相比较,通过观察,一共进行数组长度-1 次比较

  • for (let i = 0; i < arr.length - 1; i++)
  • 把 i作为最小值起始索引 minIndex

②:里层循环是每一轮的比较来查找最小值

  • 里层循环起始值是 i + 1 个元素开始查找
  • for (let j = i + 1; j < arr.length; j++)
  • 进行比较的时候,发现最小的数组元素,把当前元素索引号给 minIndex

③:如果 minIndex 和 i 位置不一致,则交换变量

<script>
  // 选择排序算法
  let arr = [4, 2, 5, 1, 3]
// 1  [1, 2, 5, 4, 3]
// 2  [1, 2, 5, 4, 3]
// 3  [1, 2, 3, 4, 5]
// 4  [1, 2, 3, 4, 5]
// 1. 外层循环控制是几轮能够比较出来
for (let i = 0; i < arr.length - 1; i++) {
  // 最小值的索引号
  let minIndex = i

  // 2. 里层循环来查找最小值,并且记录最小值的索引号
  for (let j = i + 1; j < arr.length; j++) {
    if (arr[j] < arr[minIndex]) {
      minIndex = j
    }
  }

  // 3. 交换变量  
  if (minIndex !== i) {
    let temp = arr[minIndex]
    arr[minIndex] = arr[i]
    arr[i] = temp
  }
}
console.log(arr)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/686910.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

arcpy制作脚本工具相关(制作并添加脚本工具、脚本工具消息提示、arcpy工具自动获取数据)

前言 采用arcpy制作arcgis的脚本工具&#xff0c;记录如下。 一、脚本工具的制作 制作脚本工具分为两步&#xff1a; 1、先编写对应功能的python脚步 2、将对应功能的脚本修改为&#xff0c;能自己手动选择输入输出数据的脚本 3、将修改完的脚本添加到工具箱 1、编写代码 我…

618种草观察丨益生菌「蓝」在一起,酸奶「地域控」?

2023年的“618”&#xff0c;食饮行业中&#xff0c;种草战线格外热闹&#xff0c;品牌花式“开屏”&#xff0c;吸引消费者。 数说故事发布「SMI社媒心智品牌榜」&#xff0c;本期持续关注健康食品&#xff0c;也新增了今夏网红酸奶行业&#xff0c;一起看看这两大赛道中&…

使用power rail连接secondary pg pin的方法

过往文章&#xff1a; secondary pg pin的作用与连接 之前写到过secondary pg pin的种类与几种连接方式&#xff0c;其中使用最多的方法是NDR rule &#xff0b; route_group的方式&#xff0c;这样工作量少&#xff0c;不容易出错&#xff0c;但也有弊端&#xff0c;那就是一…

ctfshow web入门 内网渗透篇

web859 首先ssh连接上之后传个fscan上去&#xff0c;扫描下内网靶机 发现.5和.6的比较可疑。 一个存在web服务&#xff0c;一个存在445端口。 先看下445端口&#xff0c;靶机给我们提供了msf&#xff0c;所以直接用msf打下Samba msfconsole use exploit/linux/samba/is_kno…

数字贸易下转口贸易企业如何高效管理?

什么是转口贸易&#xff1f;是指企业在国内购买进口货物&#xff0c;经过加工、组装、包装等方式改变其性质&#xff0c;再出口到海外市场的贸易活动。这种贸易方式对于促进国际贸易和提高企业竞争力都有着非常重要的作用&#xff0c;但同时也存在着一些风险和难点&#xff0c;…

如何向领导建议数字化转型应着手数据治理?_光点科技

在当今数字化时代&#xff0c;企业的数字化转型已经成为一个迫切的任务。然而&#xff0c;数字化转型不仅仅涉及技术的引入&#xff0c;更需要在数据治理方面进行全面的改进。 一、数据治理是数字化转型的基石。 数据是企业最重要的资产之一&#xff0c;通过对数据的管理和利用…

电气工程师日常工作常遇到的41种接线方法(二)

021 缘耐压测试仪线路 这种绝缘耐压测试仪可测灯具&#xff0c;将待测灯具与A、B两接线柱接好&#xff0c;按下按钮SB1&#xff0c;中间继电器KA1得电并自锁&#xff1b;然后将调压器VT(1∶10&#xff0c;输出0~250V)调至需测的电压值&#xff0c;如需调到1500V则将VT调到电压…

第四章.­ ­ Feasibility of Learning

第四章. Feasibility of Learning 本章主要介绍机器学习的可行性&#xff0c;讨论问题是否可以使用机器学习来解决。 4.1 Learning is Impossible 1.示例描述 1).九宫格样本类型的预测描述&#xff1a; 图中有6个样本&#xff0c;分成两个类别&#xff08;1和-1&#xff09…

pytorch搭建VGG网络

pytorch搭建VGG网络 CNN 感受野VGG-16搭建VGG网络model.pytrain.pypredict.py VGG 网络的创新点&#xff1a;通过堆叠多个小卷积核来替代大尺度卷积核&#xff0c;可以减少训练参数&#xff0c;同时能保证相同的感受野。 例如&#xff0c;可以通过堆叠两个 33 的卷积核替代 5x5…

SpringSecurity6.0+Redis+JWT基于token认证功能开发(可用于实际生产项目,保证API安全)

基于token认证功能开发 引子&#xff1a;最近做项目时遇到了一个特殊的需求&#xff0c;需要写共享接口把本系统的一些业务数据共享给各地市的自建系统&#xff0c;为了体现公司的专业性以及考虑到程序的扩展性&#xff08;通过各地市的行政区划代码做限制&#xff09;&#xf…

Java框架之spring AOP 和 IOC

写在前面 本文一起看下spring aop 和 IOC相关的内容。 1&#xff1a;spring bean核心原理 1.1&#xff1a;spring bean的生命周期 spring bean生命周期&#xff0c;参考下图&#xff1a; 我们来一步步的看下。 1 其中1构造函数就是执行类的构造函数完成对象的创建&#x…

第八十四天学习记录:Linux基础:初识Linux

流行的Linux发行版&#xff1a; 任何人都可以封装Linux&#xff0c;目前市面上有非常多的Linux发行版&#xff0c;常用的知名的如下&#xff1a; VMware WorkStations安装 安装完成后&#xff0c;要通过下图方式查看网络适配器是否正常配置&#xff1a; 配置成功&#xff1a…

软件需求分析文档怎么写?

什么是软件需求规范文档 &#xff08;SRS&#xff09;&#xff1f; 软件需求规范 &#xff08;SRS&#xff09; 文档列出了未来项目的需求、期望、设计和标准。其中包括规定项目目标的高级业务需求、最终用户要求和需求以及产品在技术方面的功能。简而言之&#xff0c;SRS 提供…

Vue-Element-Admin项目学习笔记(8)配置表单校验规则

前情回顾&#xff1a; vue-element-admin项目学习笔记&#xff08;1&#xff09;安装、配置、启动项目 vue-element-admin项目学习笔记&#xff08;2&#xff09;main.js 文件分析 vue-element-admin项目学习笔记&#xff08;3&#xff09;路由分析一:静态路由 vue-element-adm…

软考:中级软件设计师:校验码,汉明码纠错,信息位L和校验位r的关系

软考&#xff1a;中级软件设计师:校验码&#xff0c;汉明码纠错 提示&#xff1a;系列被面试官问的问题&#xff0c;我自己当时不会&#xff0c;所以下来自己复盘一下&#xff0c;认真学习和总结&#xff0c;以应对未来更多的可能性 关于互联网大厂的笔试面试&#xff0c;都是…

Linux通过crontab定时执行脚本任务

Linux通过crontab定时执行脚本任务 前言1. 创建写入脚本2. 设置执行权限3. 添加定时任务定时任务语法格式每分钟写入一条信息到指定文件 4. 查看日志文件5. 定时执行脚本的作用和用途 前言 在Linux中可以使用crontab来定时执行脚本。crontab是一个用于管理定时任务的工具&…

我这样回答多线程并发,面试官直接惊叹!

目录 前言&#xff1a; 1.单线程执行 2、多线程执行 3.守护线程 4.阻塞线程 前言&#xff1a; 多线程并发是一种处理任务的方式&#xff0c;它可以在同一时间内执行多个任务。多线程并发通常应用于需要同时处理多个任务或同时运行多个程序的情况下。 1.单线程执行 Pyth…

便携式水污染检测设备可以分析多少项污水指标

便携式水污染检测设备可以分析多少项污水指标&#xff08;以下只是一部分&#xff09; 水质检测仪可检测范围 1、饮用水检测&#xff1a;生活用水&#xff08;自来水&#xff09;、&#xff08;瓶、桶装&#xff09;矿泉水、天然矿泉水等&#xff1b; 2、工业用水检测&#xf…

人机融合智能的现状与展望

本篇文章是博主在人工智能等领域学习时&#xff0c;用于个人学习、研究或者欣赏使用&#xff0c;并基于博主对人工智能等领域的一些理解而记录的学习摘录和笔记&#xff0c;若有不当和侵权之处&#xff0c;指出后将会立即改正&#xff0c;还望谅解。文章分类在学习摘录和笔记专…

【开源库剖析】Shadow v2.3.0 源码解析

作者&#xff1a;Stan_Z 一、框架介绍 Shadow是19年腾讯开源的自研Android插件化框架&#xff0c;经过线上亿级用户量检验。 Shadow不仅开源分享了插件技术的关键代码&#xff0c;还完整的分享了上线部署所需要的所有设计。 优点&#xff1a; 1&#xff09;复用独立安装app源…