【JavaScript】数组 Array 总结(202404)

🥰 数组 Array (202404)

数组 🔗

❤️‍🔥 数组是一种有序的多个变量值的集合,可以通过索引来获取元素。

❤️‍🔥 数组是一种特殊的对象类型。

1、创建数组

字面量

// a. 有元素
let arr = ['a', 'b', 'c'];
console.log(arr);
// b. 空数组
let arr1 = [];
console.log(arr1);
// c. 创建初始长度为10的数组
let arr2 = [];
arr2.length = 10;
console.log(arr2);
// 元素为空,访问为 undefined
console.log(arr2[1]); // undefined

构造函数 🔗 Array

Array() 构造函数用于创建 Array 对象。

// 语法
// elementN : 用于创建数组的元素。

new Array();
new Array(element0);
new Array(element0, element1);
new Array(element0, element1, /* … ,*/ elementN);
new Array(arrayLength);

Array();
Array(element0);
Array(element0, element1);
Array(element0, element1, /* … ,*/ elementN);
Array(arrayLength);

🔹 调用 Array() 时可以使用或不使用 new。两者都会创建一个新的 Array 实例。

let arr3 = new Array('a', 'b', 'c');
console.log(arr3);
let arr4 = Array('a', 'b', 'c');
console.log(arr4);
let arr5 = new Array(10);
console.log(arr5);
console.log(arr5[1]); // undefined

❤️‍🔥 推荐字面量的方式创建数组

创建多维数组

let arr = [
  [1, 1],
  [1, 2],
  [1, 3],
  [2, 1],
  [2, 2],
  [2, 3],
];
console.table(arr);
console.log(arr[0]); // (2) [1, 1]

Array.of 🔗

Array.of() 静态方法通过可变数量的参数创建一个新的 Array 实例,而不考虑参数的数量或类型。

// 语法
// elementN : 用于创建数组的元素。
Array.of();
Array.of(element0);
Array.of(element0, element1);
Array.of(element0, element1, /*… ,*/ elementN);
let arr = Array.of();
console.log(arr); // []

arr[10] = 'a';
console.log(arr); // (11) [empty × 10, 'a']

console.log(arr[1]); // undefined

let arr1 = Array.of('a', 'b', 'c');
console.log('arr1:', arr1); // (3) ['a', 'b', 'c']
arr1[10] = '10';
console.log(arr1); //(11) ['a', 'b', 'c', empty × 7, '10']

🆙 Array.of vs Array()
设置一个参数时不会创建空元素数组

let arr = Array.of(10);
console.log(arr); // [10]
console.log(arr.length); // 1
console.log(arr[0]); // 10

let arr1 = new Array(10);
console.log(arr1); // (10) [empty × 10]
console.log(arr1.length); // 10
console.log(arr1[0]); // undefined

类型检测 Array.isArray() 🔗

检测当前变量的数据类型是否为数组。
Array.isArray() 静态方法用于确定传递的值是否是一个数组。

// value:需要检测的值。
// 返回值:如果 value 是 Array,则为 true;否则为 false。
Array.isArray(value);
console.log(Array.isArray([])); // true
console.log(Array.isArray(new Array())); //true
console.log(Array.isArray(Array())); //true

console.log(Array.isArray(new Array(3))); // true
console.log(Array.isArray(new Array(3, 4))); // true

console.log(Array.isArray(Array.of(3))); //true

console.log(Array.isArray({
   })); // false
console.log(Array.isArray(1)); // false
console.log(Array.isArray(1, 2)); // false
console.log(Array.isArray(1, [1, 2])); // false
console.log(Array.isArray('a')); //false

2、类型转换

可以将数组转换为字符串也可以将其他类型转换为数组。

字符串

toString() 🔗

toString() 方法返回一个字符串,表示指定的数组及其元素。

// 1.1 toString()
console.log(['a', 'b', 'c'].toString()); // a,b,c
console.log([1, 2, 3].toString()); // 1,2,3
console.log([1, , , 3].toString()); // 1,,,3
console.log([undefined, null].toString()); // ,

let obj1 = {
   
  name: 'obj1',
};
let obj2 = {
   
  name: 'obj2',
};
console.log([obj1, obj2].toString()); //[object Object],[object Object]
🔗 String()
console.log(String(['a', 'b', 'c'])); // a,b,c
console.log(String([1, 2, 3])); //  1,2,3
console.log(String([1, , , 3])); //  1,,,3
console.log(String([undefined, null])); // ,
console.log(String([obj1, obj2])); // [object Object],[object Object]
🔗 Array.prototype.join()
join();

join(separator);
// 指定一个字符串来分隔数组的每个元素。
//   如果需要,将分隔符转换为字符串。
//   如果省略,数组元素用逗号(,)分隔。
//   如果 separator 是空字符串(""),则所有元素之间都没有任何字符。
console.log(['a', 'b', 'c'].join()); // a,b,c
console.log(['a', 'b', 'c'].join('-')); //a-b-c'
console.log([1, 2, 3].join()); // 1,2,3
console.log([1, 2, 3].join('')); // 123
console.log([1, , , 3, , ,].join('.')); // 1...3..
console.log([undefined, null].join()); // ,
console.log([obj1, obj2].join('-')); //[object Object]-[object Object]

🔗 Array.from()

Array.from() 静态方法从🔗 可迭代或🔗 类数组对象创建一个新的浅拷贝的数组实例。

Array.from(arrayLike);
Array.from(arrayLike, mapFn);
Array.from(arrayLike, mapFn, thisArg);
  • arrayLike : 想要转换成数组的类数组或可迭代对象。
    • JavaScript 中的“类(似)数组对象”是指一个有 length 属性,具体说是大于等于 0 的整数值的对象。
    • 如果你把类数组对象作为第一个参数传给 Array.from(…),它的行为方式和 slice() (没有参数)或者 apply(…) 是一样的,就是简单地按照数字命名的属性从 0 开始直到 length 值在这些值上循环。
    • 第一个参数是否为 iterable ,如果是的话,就使用迭代器来产生值并“复制”进入返回的数组。因为真正的数组有一个这些值之上的迭代器,所以 会自动使用这个迭代器。
  • mapFn : 【可选】第二个参数是一个映射 回调(和一般的 Array#map(…) 所期望的几乎一样),这个函数会被调用,来把来自于源的 每个值映射/转换到返回值。
  • thisArg : 这个参数为作为第二个参数传入的回调指定 this 绑定。否则,this 将会是 undefined。
console.log('Array.from()');
let str = 'hello world';
console.log(Array.from(str)); 
//(11) ['h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd']
let num = 10;
console.log(Array.from(num)); // []
❇️ 将类数组转换为数组
// 类数组对象 转为 数组
let likeArr = {
   
  length: 3,
};
console.log(Array.from(likeArr)); // (3) [undefined, undefined, undefined]
console.log(new Array(3)); // (3) [empty × 3]

let likeArr1 = {
   
  0: 'a',
  1: 'b',
  length: 2,
};
console.log(Array.from(likeArr1)); //(2) ['a', 'b']
为对象设置 length 属性后也可以转换为数组,但要下标为数值或数值字符串
let obj = {
   
  0: 'zhangsan',
  1: 19,
  2: 1.88,
  length: 3,
};

console.log(obj);
console.log(Array.from(obj)); //(3) ['zhangsan', 19, 1.88]
DOM 元素转换为数组后来使用数组函数,第二个参数类似于 map 函数的方法,可对数组元素执行函数处理
<button message="a">button</button> <button message="b">button</button>
const btns = document.querySelectorAll('button');
console.log(btns); // NodeList(2) [button, button] 有length属性
console.log(Array.isArray(btns)); //false

// btns.map((item)=>item.style.color = 'yellow') // btns.map is not a function

Array.from(btns, (item, index) => {
   
  item.style.background = 'red';
  item.style.color = 'yellow';
});

Array.from(btns).map((item) => (item.style.margin = '40px'));

展开语法:使用展开语法将 NodeList 转换为数组操作

.hidden {
   
  display: none;
}
<!-- 展开语法 -->
<div>aaa</div>
<div>bbb</div>
const divs = document.querySelectorAll('div');
console.log(divs); //NodeList(2) [div, div]
[...divs].map((item) => {
   
  item.style.backgroundColor = '#ccc';
  item.style.margin = '40px';
  item.style.height = '40px';
  item.style.width = '200px';
  item.style.lineHeight = '40px';
  item.style.textAlign = 'center';

  console.log(this);

  item.addEventListener('click', function () {
   
    console.log(this);
    this.classList.toggle('hidden');
  });
});

3、 展开语法 🔗 Spread syntax

数组合并

const arr1 = ['a', 'b', 'c'];
const arr2 = [1, 2, 3];

console.log([...arr1, ...arr2]); //(6) ['a', 'b', 'c', 1, 2, 3]

const obj = {
   
  name: 'info',
};
console.log([...arr1, obj]); //(4) ['a', 'b', 'c', {name:"info"}]

// 复制数组 浅拷贝
const arr3 = ['c', 'o', 'p', 'y', {
    name: 'copy' }];
const copyArr3 = [...arr3];
console.log(copyArr3); //(4) ['c', 'o', 'p', 'y',{name: 'copy'}]

console.log(arr3 === copyArr3); //false

console.log(arr3[4] === copyArr3[4]); //true

函数参数

  • 等价于 apply 的方式
  • 使用展示语法可以替代 arguments 🔗来接收任意数量的参数
  • 剩余参数🔗Rest parameters
function fn(...args) {
   
  console.log(args); // (6) [1, 2, 3, 4, 'a', 'b']
  console.log(Array.isArray(args)); // true
}
fn(1, 2, 3, 4, 'a', 'b');

function bar(a, ...args) {
   
  console.log(a, args); // hello (4) [1, 2, 3, 4]
}
bar('hello', 1, 2, 3, 4);

节点转换

将 DOM 节点转为数组 NodeList 🔗

<button>aaa</button> <button>bbb</button>
const btns = document.querySelectorAll('button');
console.log(btns); // NodeList(2) [button, button]
// btns.filter((item)=>item.innerHtml = '按钮') // btns.filter is not a function

console.log([...btns]); //(2) [button, button]

[...btns].filter((item, index) => (item.innerHTML = `按钮${
     index}`));

4、解构赋值

Destructuring assignment 🔗
解构赋值语法是一种 Javascript 表达式。
可以将数组中的值或对象的属性取出,赋值给其他变量。

// 数组
const [name, age] = ['张三', 18];
console.log(name, age); //张三 18

let [[p1], [p2, p3]] = [['a'], ['b', 3]];
console.log(p1, p2, p3); // a b 3

let [obj] = [
  {
   
    name: 'obj',
  },
];
console.log(obj); // {name: 'obj'}
// 解构赋值数组
function getData() {
   
  return ['李四', 19];
}
const [name1, age1] = getData();
console.log(name1, age1);

// 剩余解构
let [num1, ...nums] = [1, 2, 3, 4, 5];
console.log(num1, nums); // 1 (4)[2, 3, 4, 5]

// 只赋值部分变量
let [num2, , ...num3] = [1, 2, 3, 4, 5];
// 索引为1的数组元素将被跳过
console.log(num2, num3); // 1 (3) [3, 4, 5]

// 字符串解构
let [...str] = 'hello world';
console.log(str); // (11) ['h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd']

// 默认值
let [a = 'name', b] = ['王五'];
console.log(a); //王五

// 函数参数
function foo([a, b]) {
   
  console.log(a, b);
}
foo(['hello', 'world']); // hello world

const result = [
  [1, 2],
  [3, 4],
].map(([a, b]) => a + b);
console.log(result); //[3,7]

5、💠 管理元素

基本使用

通过索引改变数组

// 1.通过索引添加元素
let arr = [];
arr[1] = '1';
console.log(arr); // (2) [empty, '1']

arr[4] = '4';
console.log(arr); // (5) [empty, '1', empty × 2, '4']

// 2.通过索引改变元素
console.log('更改前:', arr[0]); // 更改前: undefined
arr[0] = '0';
console.log('更改后:', arr[0]); // 更改后: 0

通过 length 改变

// 2. 通过length
let arr = [];
console.log(arr.length); // 0
// 2.1. 通过 length的值 创建数组
arr.length = 5;
console.log(arr); // (5) [empty × 5]
console.log(arr[0]); // undefined

// 2.2 通过length 向数组最后追加一个元素 5
arr[arr.length] = '5';
console.log(arr); // (6) [empty × 5, '5']
console.log(arr.length); // 6

扩展语法 - 展开语法批量添加元素

// 3. 通过扩展语法 形成新数组

let arr1 = ['0', '1'];
let arr2 = ['2', '3'];

// 给数组首位添加元素 形成新数组
let arr3 = ['a', ...arr1];
console.log(arr3); // (3) ['a', '0', '1']

// 给数组末尾添加元素
let arr4 = [...arr2, 'd'];
console.log(arr4); //  ['2', '3', 'd']

// 合并数组
let arr = [...arr1, ...arr2];
console.log(arr); //(4) ['0', '1', '2', '3']

// arr1 除了 arr1[0] 元素,其余元素与 arr2 合并
let [, x1] = arr1;
let arrEx = [x1, ...arr2];
console.log('arrEx', arrEx);

Array.prototype.push()🔗

push() 方法将指定的元素添加到数组的末尾并返回新的数组长度

🔸 语法

push();
// elementN : 添加到数组末尾的元素。
push(element0);
push(element0, element1);
push(element0, element1, /*… ,*/ elementN);
// 原数组
const animals = ['pigs', 'goats', 'sheep'];

// 1.push 改变原数组 返回值为数组长度
let count <

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

备战面试K8S

备战面试&&K8S Kubernetes关于DockerDocker的优缺点分析 WebAssemblyWebAssembly与Container比较 CtrCrictlCtr和CriCtl的区别 Pod生命周期PodConditions容器状态Pod容器组成生命周期的流程 Kubelet EFK日志采集工具的优缺点 Kubernetes 容器运行接口 Container Runti…

2024年免费云服务器推荐,小编亲测好用!

随着云计算技术的飞速发展&#xff0c;云服务器以其弹性、高效、安全的特性&#xff0c;成为众多企业和个人用户的首选。尽管市面上有众多收费的云服务器产品&#xff0c;但免费的云服务器仍然吸引着大量用户&#xff0c;尤其是初学者和预算有限的用户。下面&#xff0c;我们就…

从API到Agent:洞悉LangChain工程化设计

作者&#xff1a;范志东 原文&#xff1a;https://mp.weixin.qq.com/s/zGS9N92R6dsc9Jk57pmYSg 本文作者试着从工程角度去理解LangChain的设计和使用。大家可以将此文档作为LangChain的“10分钟快速上手”手册&#xff0c;希望帮助需要的同学实现AI工程的Bootstrap。 我想做一…

[Vision Board创客营]学习片上Flash移植FAL

文章目录 [Vision Board创客营]学习片上Flash移植FAL介绍环境搭建使用组件测试porbeerasewriteread 结语 [Vision Board创客营]学习片上Flash移植FAL 水平较菜&#xff0c;大佬轻喷。&#x1f630;&#x1f630;&#x1f630; 介绍 &#x1f680;&#x1f680;Vision-Board 开…

安全开发实战(3)--存活探测与端口扫描

目录 安全开发专栏 前言 存活探测 端口扫描 方式一: 1.3.1 One 1.3.2 Two 1.3.3 批量监测 方式二: 1.3.1 One 1.3.2 Two 1.3.3 Three 1.3.4 扫描ip地址,提取出开放端口和协议 ​编辑 1.3.5 批量扫描(最终完成版) 总结 安全开发专栏 安全开发实战​http://t.csd…

MySql数据库从0-1学习-第五天事务和索引

事务 事务 是一组操作的集合&#xff0c;它是一个不可分割的工作单位。事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求&#xff0c;即这些操作 要么同时成功&#xff0c;要么同时失败。 注意事项,默认事务是自动提交的,也就是说,当执行一条DML语句,MySql会立即隐…

【Java开发指南 | 第八篇】Java变量、构造方法、创建对象

读者可订阅专栏&#xff1a;Java开发指南 |【CSDN秋说】 文章目录 Java变量构造方法创建对象 Java变量 在Java中&#xff0c;变量用于存储数据值。它们是程序中用于保存信息的一种基本方式。变量在程序执行过程中可以被赋予不同的值&#xff0c;并且这些值可以在程序的不同部分…

超越现实的展览体验,VR全景展厅重新定义艺术与产品展示

随着数字化时代的到来&#xff0c;VR全景展厅成为了企业和创作者展示作品与产品的新兴选择。通过结合先进的虚拟现实技术&#xff0c;VR全景展厅不仅能够提供身临其境的观展体验&#xff0c;而且还拓展了传统展示方式的界限。 一、虚拟现实技术的融合之美 1、高度沉浸的观展体验…

Unity开发holoLens2应用时的ProjectSettings配置

正确的进行Unity工程配置&#xff0c;才能进行后续的【发布】和【部署】操作… 本案例开发环境说明&#xff1a; Unity2021.3.18Win10VS2022HoloLens2 一、平台设置 二、Quality画面质量设置 三、Player玩家设置 四、XR-Plug设置 五、环境测试 导入一个官方demo&#xff0c…

EasyPoi表格导入添加校验

EasyPoi表格导入添加校验 项目添加maven依赖实体类自定义校验controller测试结果 代码地址 项目添加maven依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www…

【任务调度】Apache DolphinScheduler快速入门

Apache DolphinScheduler基本概念 概念&#xff1a;分布式、去中心化、易扩展的可视化DAG工作流任务调度系统。 作用&#xff1a;解决数据处理流程中错综复杂的依赖关系&#xff0c;使调度系统在数据处理流程中开箱即用。Apache DolphinScheduler是一款开源的调度工具&#xff…

紫光展锐携手中国联通智慧矿山军团(山西)完成RedCap现网环境测试

近日&#xff0c;紫光展锐与中国联通智慧矿山军团&#xff08;山西&#xff09;在现网环境下成功完成了RedCap技术测试。此次测试对搭载紫光展锐RedCap芯片平台V517的模组注网速度和信号情况、Iperf打流测试上下行情况、ping包延时情况以及模组拨号入网压测等项目进行了全面验证…

OpenHarmony UI动画-rebound

简介 rebound是一个模拟弹簧动力学&#xff0c;用于驱动物理动画的库。 下载安装 ohpm install ohos/reboundOpenHarmony ohpm环境配置等更多内容&#xff0c;请参考如何安装OpenHarmony ohpm 使用说明 import rebound from ohos/rebound;功能一&#xff1a;创建维护弹簧对…

韩顺平Java | C27 正则表达式

入门介绍 需求&#xff1a;提取文本中某类字符 传统方法&#xff1a;遍历每个字符&#xff0c;判断其是否在ASCII码中某种类型得编码范围内&#xff0c;代码量大&#xff0c;效率不高 正则表达式(RegExp, regular expression)&#xff1a;处理文本的利器&#xff0c;是对字符…

【详细介绍下图搜索算法】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

Golang入门基础

文章目录 Golang的背景知识Golang的发展历程Golang的特点Golang的应用领域 开发环境搭建下载并安装SDK包设置环境变量Go项目目录结构 注释变量标识符命名输入和输出运算符算术运算符关系运算符逻辑运算符赋值运算符位运算符其他运算符 Golang的背景知识 Golang的发展历程 Gola…

高仿小米商城用户端

高仿小米商城用户端(分为商城前端&#xff08;tongyimall-vue)和商城后端(tongyimall-api)两部分)&#xff0c;是Vue SpringBoot的前后端分离项目&#xff0c;用户端包括首页门户、商品分类、首页轮播、商品展示、商品推荐、购物车、地址管理、下订单、扫码支付等功能模块。 …

Docker Volume (存储卷)

什么是存储卷? 存储卷就是将宿主机的本地文件系统中存在的某个目录直接与容器内部的文件系统上的某一目录建立绑定关系。这就意味着&#xff0c;当我们在容器中的这个目录下写入数据时&#xff0c;容器会将其内容直接写入到宿主机上与此容器建立了绑定关系的目录。在宿主机上…

「51媒体」权重高新闻源央级媒体邀约资料有哪些?

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 权重高的央级媒体邀约资源包括了中国一些最具影响力和权威性的新闻机构。具体如下&#xff1a; 人民日报&#xff1a;作为中国共产党中央委员会的机关报&#xff0c;人民日报具有极高的权…

openEuler-23.03下载

下载地址&#xff1a;openEuler下载 | 欧拉系统ISO镜像 | openEuler社区官网 下载版本&#xff1a;openEuler-23.03-x86_64-dvd.iso
最新文章