当前位置: 首页 > news >正文

ES6 - 数组新增的一些常用方法

文章目录

    • 1,Array.from()
    • 2,Array.of()
    • 3,find(),findIndex(),findLast()和findLastIndex()
    • 4,Array.fill()
    • 5,keys(),values() 和 entries()
    • 6,Array.includes()
    • 7,flat()和flatMap()
    • 8,Array.reduce()

这篇文章介绍ES6数组新增的一些常用方法。

1,Array.from()

Array.from()方法用于将两类对象转为真正的数组:类数组对象和可遍历(iterable)的对象
(包括 ES6 新增的数据结构 Set 和 Map)。

下面是一个类似数组的对象,Array.from()将它转为真正的数组。

let arrayLike = {'0': 'a','1': 'b','2': 'c',length: 3
};// ES5 的写法
var arr1 = [].slice.call(arrayLike); // ['a', 'b', 'c']// ES6 的写法
let arr2 = Array.from(arrayLike); // ['a', 'b', 'c']

实际应用中,常见的类似数组的对象是 获取DOM 节点的 NodeList 集合或HTMLCollection集合,以及函数内部的arguments对象。Array.from()都可以将它们转为真正的数组。

看以下的案例:

    <div class="container"><div class="item">安柏</div><div class="item">优菈</div><div class="item">神里绫华</div></div>// HTMLCollection 伪数组const itemList = document.getElementsByClassName("item") // HTMLCollection(3) [div.item, div.item, div.item]// NodeList 伪数组const itemList2 = document.querySelectorAll(".item") //NodeList(3) [div.item, div.item, div.item]// 1,直接进行遍历会报错 因为不是一个真正的数组,所以不能使用forEach,map,filter等数组遍历的方法itemList.map((item)=>{console.log(item);}) // 报错信息: itemList.map is not a function// 2,使用Array.from转为真数组const newItemList = Array.from(itemList)// 3,可以遍历成功newItemList.map((item)=>{console.log(item);})// 遍历结果<div class="item">安柏</div><div class="item">优菈</div><div class="item">神里绫华</div>

上面代码中,querySelectorAll()getElementsByClassName方法返回的是一个类数对象数组(也叫伪数组)可以将这个对象转为真正的数组,再使用map()等数组的方法。

注意:只要是部署了 Iterator 接口的数据结构,Array.from()都能将其转为数组。

      Array.from("Eula-优菈"); // ['E', 'u', 'l', 'a', '-', '优', '菈']let mySet = new Set(["Eula", "优菈"]);Array.from(mySet); //['Eula', '优菈']

上面代码中,字符串和 Set 结构都具有 Iterator 接口,因此可以被Array.from()转为真正的数组。

-----(对Iterator 不了解的可以见这篇文章)------

如果参数是一个真正的数组,Array.from()会返回一个一模一样的新数组。

Array.from([1, 2, 3])
// [1, 2, 3]

扩展运算符(...)也可以将某些数据结构转为数组;下面的案例是把函数传入的不定参数进行累加计算并返回。

      function sum() {let sum = 0;const args = [...arguments];//  [...arguments] 已经转为真正的数组 [1, 2, 3, 4]  然后累加求和args.forEach((item) => {return (sum += item);});return sum;}let mySum = sum(1, 2, 3, 4);console.log("mySum:", mySum); // 10

扩展运算符背后调用的是遍历器接口(Symbol.iterator),如果一个对象没有部署这个接口,就无法转换。

Array.from()还可以接受一个函数作为第二个参数,作用类似于数组的map()方法,用来对每个元素进行处理,将处理后的值放入返回的数组。

      let arrayLike = [1, 2, 3, 4, 5];let newArray1 = Array.from(arrayLike, (item) => item * 2);console.log("newArray1:", newArray1); // [2, 4, 6, 8, 10]// 等同于let newArray2 = Array.from(arrayLike).map((item) => item * 2);console.log("newArray2:", newArray2); // [2, 4, 6, 8, 10]

Array.from()可以将各种值转为真正的数组,并且还提供map功能。这实际上意味着,只要有一个原始的数据结构,你就可以先对它的值进行处理,然后转成规范的数组结构,进而就可以使用数量众多的数组方法。


2,Array.of()

Array.of()方法将一组值转换为数组。

	  Array.of(1, 2, 3, 4); // [1, 2, 3, 4]Array.of(3); // [3]Array.of(3).length; // 1// 字符也可以Array.of("1",2,"3",4) //  ['1', 2, '3', 4]Array.of("1",2,"3",4).length // 4

这个方法的主要目的,是弥补数组构造函数Array()的不足。因为参数个数的不同,会导致Array()的行为有差异。如下:

  console.log(new Array()); // []console.log(new Array(3)); // [empty × 3]console.log(new Array(3,11,8)); // [3, 11, 8]

上面代码中,new Array()方法没有参数、一个参数、三个参数时,返回的结果都不一样。只有当参数个数不少于 2 个时,new Array()才会返回由参数组成的新数组。

参数只有一个正整数时,实际上是指定数组的长度。

Array.of()基本上可以用来替代Array()new Array(),并且不存在由于参数不同而导致的重载。它的行为非常统一。

Array.of() // []
Array.of(undefined) // [undefined]
Array.of(1) // [1]
Array.of(1, 2) // [1, 2]

Array.of()总是返回参数值组成的数组。如果没有参数,就返回一个空数组。

Array.of()方法可以用下面的代码模拟实现。

function ArrayOf(){return [].slice.call(arguments);
}

3,find(),findIndex(),findLast()和findLastIndex()

find():

数组实例的find()方法,用于找出第一个符合条件的数组成员。它的参数是一个回调函数,所有数组成员依次执行该回调函数,直到找出第一个返回值为true的成员,然后返回该成员。如果没有符合条件的成员,则返回undefined

[1, 4, -5, 10].find((n) => n < 0)
// -5

上面代码找出数组中第一个小于 0 的成员。

[1, 5, 10, 15].find(function(value, index, arr) {return value > 9;
}) // 10

上面代码中,find()方法的回调函数可以接受三个参数,依次为当前的值、当前的位置和原数组。

findIndex:

数组实例的findIndex()方法的用法与find()方法非常类似,返回第一个符合条件的数组成员的位置(索引),如果所有成员都不符合条件,则返回-1

[1, 5, 10, 15].findIndex(function(value, index, arr) {return value > 9;
}) // 2

这两个方法都可以接受第二个参数,用来绑定回调函数的this对象。

function f(v){return v > this.age;
}
let person = {name: 'John', age: 20};
[10, 12, 26, 15].find(f, person);    // 26

上面的代码中,find()函数接收了第二个参数person对象,回调函数中的this对象指向person对象。

find()findIndex()都是从数组的0号位,依次向后检查。

findLast()和findLastIndex():

findLast()findLastIndex()却是从数组的最后一个成员开始,依次向前检查,其他都保持不变。

const array = [{ value: 1 },{ value: 2 },{ value: 3 },{ value: 4 }
];array.findLast(n => n.value % 2 === 1); // { value: 3 }
array.findLastIndex(n => n.value % 2 === 1); // 2

上面示例中,findLast()findLastIndex()从数组结尾开始,寻找第一个value属性为奇数的成员。结果,该成员是{ value: 3 },位置是2号位。


4,Array.fill()

fill方法使用给定值,填充一个数组。

['a', 'b', 'c'].fill(7)
// [7, 7, 7]new Array(3).fill(7)
// [7, 7, 7]

上面代码表明,fill方法用于空数组的初始化非常方便。数组中已有的元素,会被全部抹去。

fill方法还可以接受第二个和第三个参数,用于指定填充的起始位置和结束位置。

['a', 'b', 'c'].fill(7, 1, 2)
// ['a', 7, 'c']

上面代码表示,fill方法从 1 号位开始,向原数组填充 7,到 2 号位之前结束。

注意,如果填充的类型为对象,那么被赋值的是同一个内存地址的对象,而不是深拷贝对象。

let arr = new Array(3).fill({name: "Amber"});
arr[0].name = "Eula";  // 只改了第一个, 但是后面的所有全都改变了
console.log(arr);
// [{name: "Eula"}, {name: "Eula"}, {name: "Eula"}]

5,keys(),values() 和 entries()

ES6 提供三个新的方法:entries()keys()values()—用于遍历数组。

它们都返回一个遍历器对象(Iterator),可以用for...of循环进行遍历,唯一的区别是keys()是对键名的遍历、values()是对键值的遍历,entries()是对键值对的遍历。

1,keys()是对键名的遍历

      let obj = {Amber: "安柏",Eula: "优菈",KamisatoAyaka: "神里绫华"};// for of不支持遍历普通对象,可通过与Object.keys()搭配使用遍历for (let key of Object.keys(obj)) {console.log(key); // Amber,Eula,KamisatoAyaka  拿到的都是对象的键名}console.log(Object.keys(obj)); //(3) ['Amber', 'Eula', 'KamisatoAyaka']

2,values()是对键值的遍历

      let obj = {Amber: "安柏",Eula: "优菈",KamisatoAyaka: "神里绫华"};for (let key of Object.values(obj)) {console.log(key); // 安柏,优菈,神里绫华  拿到的都是对象的值}console.log(Object.values(obj)); //(3) ['安柏', '优菈', '神里绫华']

3,entries()是对键值对的遍历

 let obj = {Amber: "安柏",Eula: "优菈",KamisatoAyaka: "神里绫华"};for (let key of Object.entries(obj)) {console.log(key);// ['Amber', '安柏']// ['Eula', '优菈']// ['KamisatoAyaka', '神里绫华']}console.log(Object.entries(obj));// 会以一个数组重新包装起来// [//   ["Amber", "安柏"],//   ["Eula", "优菈"],//   ["KamisatoAyaka", "神里绫华"]// ];

entries方法还有个用法就是:将Object转换为Mapnew Map()构造函数接受一个可迭代的entries。借助Object.entries方法你可以很容易的将Object转换为Map:

  	let obj = {name: "Eula",age: 18};let map = new Map(Object.entries(obj));console.log(map); // Map(2) {'name' => 'Eula', 'age' => 18}

6,Array.includes()

includes 可以判断一个数组中是否包含某一个元素,并返回true 或者false

      const inc = ["a", "b", "c"].includes("a");console.log("inc:", inc); // true

该方法的第二个参数表示搜索的起始位置,默认为0。如果第二个参数为负数,则表示倒数的位置,如果这时它大于数组长度(比如第二个参数为-4,但数组长度为3),则会重置为从0开始。

	[1, 2, 3].includes(3, 3);  // false[1, 2, 3].includes(3, -1); // true

没有该方法之前,我们通常使用数组的indexOf方法,检查是否包含某个值。

	if (arr.indexOf(el) !== -1) {// ...}

indexOf方法有两个缺点,一是不够语义化,它的含义是找到参数值的第一个出现位置,所以要去比较是否不等于-1,表达起来不够直观。二是,它内部使用严格相等运算符(===)进行判断,这会导致对NaN的误判。

	[NaN].indexOf(NaN)// -1

includes使用的是不一样的判断算法,就没有这个问题。

	[NaN].includes(NaN)// true

7,flat()和flatMap()

数组扁平化方法 Array.prototype.flat() 也叫数组拉平、数组降维。

  • 不传参数时,默认“拉平”一层,可以传入一个整数,表示想要“拉平”的层数。
  • 传入 <=0 的整数将返回原数组,不“拉平”。
  • Infinity 关键字作为参数时,无论多少层嵌套,都会转为一维数组。
  • 如果原数组有空位,Array.prototype.flat() 会跳过空位。

看下面案例:

      const arr = [1, ["a", "b"], [2, ["c"], 3]];// 1,不传参数时,默认“拉平”一层console.log(arr.flat());// [1, 'a', 'b', 2, ['c'], 3]// 2,传入一个整数参数,整数即“拉平”的层数console.log(arr.flat(2));//  [1, 'a', 'b', 2, 'c', 3]// 3,Infinity 关键字作为参数时,无论多少层嵌套,都会转为一维数组console.log(arr.flat(Infinity));// [1, 'a', 'b', 2, 'c', 3]// 4,传入 <=0 的整数将返回原数组,不“拉平”console.log(arr.flat(0));console.log(arr.flat(-6));// [1, ['a', 'b'], [2, ['c'], 3]]// 5,如果原数组有空位,flat()方法会跳过空位console.log([1, 2, 3, 4, 5, 6, ,].flat());//  [1, 2, 3, 4, 5, 6]

flatMap:

flatMap()方法对原数组的每个成员执行一个函数(相当于执行Array.prototype.map()),然后对返回值组成的数组执行flat()方法。该方法返回一个新数组,不改变原数组。

flatMap()方法的参数是一个遍历函数,该函数可以接受三个参数,分别是当前数组成员、当前数组成员的位置(从零开始)、原数组。

  let newFlatList = [[2, 4], [3, 6], [4, 8]].flatMap((item,index,arr) => {console.log("item:",item);//  [2, 4]   [3, 6]  [4, 8]return [item[0]*2,item[1]*3] // 第一项*2,第二项*3,每个item都执行这个操作,最后flat扁平化数组并返回});console.log("newFlatList:",newFlatList); //最终返回一维数组: [4, 12, 6, 18, 8, 24]

上面的案例是传入一个二维数组,把二维数组的第一项乘以2,第二项乘以3;最终返回处理好的一维数组;

注意:

  1. flatMap 方法不会改变原数组
  2. flatMap 方法等效于 array.map().flat()
  3. flatMap()只能展开一层数组

8,Array.reduce()

reduce() 方法对数组中的每个元素按序执行一个由您提供的 reducer 函数,每一次运行 reducer
会将先前元素的计算结果作为参数传入,最后将其结果汇总为单个返回值。

请见这篇文章:ES6新增高阶函数reduce()讲解

相关文章:

ES6 - 数组新增的一些常用方法

文章目录 1&#xff0c;Array.from()2&#xff0c;Array.of()3&#xff0c;find()&#xff0c;findIndex()&#xff0c;findLast()和findLastIndex()4&#xff0c;Array.fill()5&#xff0c;keys()&#xff0c;values() 和 entries()6&#xff0c;Array.includes()7&#xff0c…...

【BEV感知】3-BEV开源数据集

3-BEV开源数据集 1 KITTI1.1 KITTI数据怎么采集?1.2 KITTI数据规模有多大?1.3 KITTI标注了哪些目标?1.4 转换矩阵1.5 标签文件 2 nuScenes2.1 nuScenes Vs KITTI2.2 标注文件 1 KITTI KITTI 1.1 KITTI数据怎么采集? 通过车载相机、激光雷达等传感器采集。 只提供了相机正…...

Kafka-Broker工作流程

kafka集群在启动时&#xff0c;会将每个broker节点注册到zookeeper中&#xff0c;每个broker节点都有一个controller&#xff0c;哪个controller先在zookeeper中注册&#xff0c;哪个controller就负责监听brokers节点变化&#xff0c;当有分区的leader挂掉时&#xff0c;contro…...

第八篇-Tesla P40+ChatGLM2+LoRA

部署环境 系统&#xff1a;CentOS-7CPU: 14C28T显卡&#xff1a;Tesla P40 24G驱动: 515CUDA: 11.7cuDNN: 8.9.2.26目的 验证P40部署可行性,只做验证学习lora方式微调创建环境 conda create --name glm-tuning python3.10 conda activate glm-tuning克隆项目 git clone http…...

调用feign返回错误的数据

bug描述&#xff1a; 在一个请求方法中会调用到feign去获取其他的数据。 List<Demo> list aaaFeignApi.getData(personSelectGetParam);在调用的时候&#xff0c;打断点到feign的地方&#xff0c;数据是存在的&#xff0c;并且有15条。但是返回到上面代码的时候数据就…...

【Spring】(二)从零开始的 Spring 项目搭建与使用

文章目录 前言一、Spring 项目的创建1.1 创建 Maven 项目1.2 添加 Spring 框架支持1.3 添加启动类 二、储存 Bean 对象2.1 创建 Bean2.1 将 Bean 注册到 Spring 容器 三、获取并使用 Bean 对象3.1 获取Spring 上下文3.2 ApplicationContext 和 BeanFactory 的区别3.3 获取指定的…...

redis五种数据类型介绍

、string&#xff08;字符串&#xff09; 它师最基本的类型&#xff0c;可以理解为Memcached一模一样的类型&#xff0c;一个key对应一个value。 注意&#xff1a;一个键最大能存储 512MB。 特性&#xff1a;可以包含任何数据,比如jpg图片或者序列化的对象,一个键最大能存储512…...

【JavaEE】Spring Boot - 项目的创建和使用

【JavaEE】Spring Boot 开发要点总结&#xff08;1&#xff09; 文章目录 【JavaEE】Spring Boot 开发要点总结&#xff08;1&#xff09;1. Spring Boot 的优点2. Spring Boot 项目创建2.1 下载安装插件2.2 创建项目过程2.3 加载项目2.4 启动项目2.5 删除一些没用的文件 3. Sp…...

Git reset、revert用法

reset reset是删除之前的提交记录&#xff0c;所有的提交点都会被清除&#xff0c;我们看下执行前后的git log区别 D:\workspace\android>git log commit 87c1277a57544c53c603b04110e3dde100da8f57 (HEAD -> develop_main) Author: test <test.com> Date: Wed…...

Redis-1

Redis 理论部分 redis 速度快的原因 1、纯内存操作 2、单线程操作&#xff0c;避免了频繁的上下文切换和资源争用问题&#xff0c;多线程需要占用更多的 CPU 资源 3、采用了非阻塞 I/O 多路复用机制 4、提供了非常高效的数据结构&#xff0c;例如双向链表、压缩页表和跳跃…...

【Linux】Linux服务器连接百度网盘:实现上传下载

【Linux】Linux服务器连接百度网盘&#xff1a;实现上传下载 文章目录 【Linux】Linux服务器连接百度网盘&#xff1a;实现上传下载1. 前言2. 具体过程2.1 pip 安装所需包2.2 认证&#xff08;第一次连接需要认证&#xff09;2.3 下载所需文件或者目录2.4 其他指令使用2.5 注意…...

ADC模拟看门狗

如果被ADC转换的模拟电压低于低阀值或高于高阀值&#xff0c;AWD模拟看门狗状态位被设置。阀值位 于ADC_HTR和ADC_LTR寄存器的最低12个有效位中。通过设置ADC_CR1寄存器的AWDIE位 以允许产生相应中断。通过以下函数可以进行配置 void ADC_AnalogWatchdogCmd(ADC_TypeDef* ADCx…...

google谷歌gmail邮箱账号注册手机号无法进行验证怎么办?此电话号码无法用于进行验证 或 此电话号码验证次数太多

谷歌gmail邮箱账号注册手机号无法进行验证怎么办? 使用手机号码注册谷歌gmail邮箱账号时会遇到&#xff1a;此电话号码无法用于进行验证 或 此电话号码验证次数太多。造成注册google谷歌gmail邮箱账号受阻&#xff0c;无法正常完成注册。 谷歌Gmail邮箱账号正确的注册方法与教…...

Spring:IOC技术、Bean、DI

前言 Spring是一个开源的项目&#xff0c;并不是单单的一个技术&#xff0c;发展至今已形成一种开发生态圈。也就是说我们可以完全使用Spring技术完成整个项目的构建、设计与开发。Spring是一个基于IOC和AOP的架构多层j2ee系统的架构。 SpringFramework&#xff1a;Spring框架…...

目标检测与跟踪 (2)- YOLO V8配置与测试

系列文章目录 第一章 目标检测与跟踪 &#xff08;1&#xff09;- 机器人视觉与YOLO V8 目标检测与跟踪 &#xff08;1&#xff09;- 机器人视觉与YOLO V8_Techblog of HaoWANG的博客-CSDN博客3D物体实时检测、三维目标识别、6D位姿估计一直是机器人视觉领域的核心研究课题&a…...

【Leetcode】56.合并区间

一、题目 1、题目描述 以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [ s t a r t i start_i start...

设置系统编码 Beta

在yolov5环境搭建过程中会遇到如下的编码错误警告&#xff1a; 这时&#xff0c;按住“ctrlc”中止进程&#xff0c;然后设置系统编码&#xff1a; 电脑右键属性打开&#xff1a; 重启之后等安装好了&#xff0c;记得回去把bae键取消。...

phpunit

composer地址&#xff1a;phpunit/phpunit - Packagist 官方文档:PHPUnit文档 – PHP测试框架 PHPUnit是一个框架&#xff0c;最为hyperf学习的补充学习&#xff0c;就不写这么细了。 估计写下安装和使用&#xff0c;具体学习内容看文档。 一、安装 需安装扩展&#xff1a;…...

html学习9(脚本)

1、<script>标签用于定义客户端脚本&#xff0c;比如JavaScript&#xff0c;既可包含脚本语句&#xff0c;也可通过src属性指向外部文件。 2、JavaScript最常用于图片操作、表单验证及内容动图更新。 3、<noscript>标签用于在浏览器禁用脚本或浏览器不支持脚本&a…...

SpringBoot整合Caffeine

一、Caffeine介绍 1、缓存介绍 缓存(Cache)在代码世界中无处不在。从底层的CPU多级缓存&#xff0c;到客户端的页面缓存&#xff0c;处处都存在着缓存的身影。缓存从本质上来说&#xff0c;是一种空间换时间的手段&#xff0c;通过对数据进行一定的空间安排&#xff0c;使得下…...

元宇宙虚拟展厅的特点是什么呢?优势有哪些?

元宇宙是一个很广阔的虚拟世界&#xff0c;它可以创造出更为丰富、沉浸式的体验&#xff0c;这种全新的体验为展览和艺术领域带来了更多的可能性&#xff0c;元宇宙虚拟展厅以其多样化、互动性、沉浸式展示的特点&#xff0c;带领大家进入一个虚拟现实的全新世界。 元宇宙虚拟展…...

Day11-Webpack前端工程化开发

Webpack 一 webpack基本概念 遇到问题 开发中希望将文件分开来编写,比如CSS代码,可以分为头部尾部内容,公共的样式。 JS代码也希望拆分为多个文件,分别引入,以后代码比较好维护。 本地图片,希望可以实现小图片不用访问后端,保存在前端代码中就可以了 运行程序时我…...

什么是函数式编程,应用场景是什么

什么是函数式编程&#xff0c;应用场景是什么 函数式编程和面向对象编程一样&#xff0c;是一种编程规范。强调执行的过程而非结果&#xff0c;通过一系列的嵌套的函数调用&#xff0c;完成一个运算过程。它主要有以下几个特点&#xff1a; 1.函数是"一等公民"&…...

Vue3之路由认识

回顾&#xff1a; 原来的vue2路由是通过this. r o u t e 和 t h i s . route和this. route和this.router来控制的。现在vue3有所变化&#xff0c;useRoute相当于以前的this. r o u t e &#xff0c;而 u s e R o u t e r 相当于 t h i s . route&#xff0c;而useRouter相当于t…...

P1775 石子合并(弱化版)(内附封面)

石子合并&#xff08;弱化版&#xff09; 题目描述 设有 N ( N ≤ 300 ) N(N \le 300) N(N≤300) 堆石子排成一排&#xff0c;其编号为 1 , 2 , 3 , ⋯ , N 1,2,3,\cdots,N 1,2,3,⋯,N。每堆石子有一定的质量 m i ( m i ≤ 1000 ) m_i\ (m_i \le 1000) mi​ (mi​≤1000)。…...

jmeter之接口测试(http接口测试)

基础知识储备 一、了解jmeter接口测试请求接口的原理 客户端--发送一个请求动作--服务器响应--返回客户端 客户端--发送一个请求动作--jmeter代理服务器---服务器--jmeter代理服务器--服务器 二、了解基础接口知识&#xff1a; 1、什么是接口&#xff1a;前端与后台之间的…...

webpack基础知识二:说说webpack的构建流程?

一、运行流程 webpack 的运行流程是一个串行的过程&#xff0c;它的工作流程就是将各个插件串联起来 在运行过程中会广播事件&#xff0c;插件只需要监听它所关心的事件&#xff0c;就能加入到这条webpack机制中&#xff0c;去改变webpack的运作&#xff0c;使得整个系统扩展…...

PHP使用PhpSpreadsheet实现导出Excel时带下拉框列表 (可支持三级联动)

因项目需要导出Excel表 需要支持下拉 且 还需要支持三级联动功能 目前应为PHPExcel 不在维护&#xff0c;固采用 PhpSpreadsheet 效果如图&#xff1a; 第一步&#xff1a;首先 使用composer 获取PhpSpreadsheet 我这里PHP 版本 7.4 命令如下&#xff1a; composer r…...

Openssh高危漏洞CVE-2023-38408修复方案

0x01 漏洞简述 2023年07月21日&#xff0c;360CERT监测发现OpenSSH发布了OpenSSH的风险通告&#xff0c;漏洞编号为CVE-2023-38408&#xff0c;漏洞等级&#xff1a;高危&#xff0c;漏洞评分&#xff1a;8.1。 OpenSSH 是 Secure Shell (SSH) 协议的开源实现&#xff0c;提供…...

Android中的ContentProvider

Android中的ContentProvider 在Android中&#xff0c;ContentProvider是四大组件之一&#xff0c;用于在不同应用程序之间共享和管理数据。它提供了一种标准化的方式来访问和管理应用程序的数据&#xff0c;使得多个应用程序可以安全地共享数据&#xff0c;而无需直接访问彼此…...