【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]); // undefinedlet 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]); // 10let 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())); //trueconsole.log(Array.isArray(new Array(3))); // true
console.log(Array.isArray(new Array(3, 4))); // trueconsole.log(Array.isArray(Array.of(3))); //trueconsole.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 functionArray.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); //falseconsole.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 functionconsole.log([...btns]); //(2) [button, button][...btns].filter((item, index) => (item.innerHTML = `按钮${index}`));

4、解构赋值

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

// 数组
const [name, age] = ['张三', 18];
console.log(name, age); //张三 18let [[p1], [p2, p3]] = [['a'], ['b', 3]];
console.log(p1, p2, p3); // a b 3let [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 worldconst 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.mzph.cn/web/244.shtml

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

相关文章

L2正则化——解释为什么可以减少模型的复杂度

L2正则化是一种用于机器学习模型的技术&#xff0c;旨在减少模型的复杂度&#xff0c;从而提高其泛化能力。在L2正则化中&#xff0c;通过添加一个惩罚项&#xff0c;模型的权重被迫保持较小的值&#xff0c;这有助于防止过拟合&#xff0c;即模型在训练数据上表现良好但在未见…

【Python】OPC UA模拟服务器实现

目录 服务器模拟1. 环境准备2. 服务器设置3. 服务器初始化4. 节点操作5. 读取CSV文件6. 运行服务器 查看服务器客户端总结 在工业自动化和物联网&#xff08;IoT&#xff09;领域&#xff0c;OPC UA&#xff08;开放平台通信统一架构&#xff09;已经成为一种广泛采用的数据交换…

单链表的基本操作实现:初始化、尾插法、头插法、输出单链表、求表长、按序号查找、按值查找、插入结点、删除结点。

1.参考学习博文&#xff08;写的相当好的文章&#xff09;&#xff1a; http://t.csdnimg.cn/AipNl 2.关于我的总结&#xff1a; 定义单链表&#xff1a; typedef struct LNode {Elemtype data;struct LNode* next; }LNode; data用来存放元素值&#xff0c;next用来指向后…

【算法】反转链表

本题来源---《反转链表》 题目描述&#xff1a; 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1]示例 2&#xff1a; 输入&#xff1a;head [1,2] 输…

前端怎样做权限控制的?

在做系统时&#xff0c;我们常常因为使用该系统或软件的用户不同&#xff0c;要给到不同角色不同的模块权限控制。那前端是怎样做权限控制的&#xff1f;下面我将为你提供一些实际操作的例子&#xff0c;帮助你更具体地理解如何实施系统权限控制。 例子1&#xff1a;基于角色的…

vue2+el-row制作一个无间距网格

:gutter"0"无间距 :span""总为24份&#xff0c;根据自身需要设置每个网格项的宽度 <div class"thirdTabs"><!-- 第一行 --><el-row :gutter"0" class"thirdTabs-row-1"><el-col :span"4" c…

医学图像三维重建与可视化系统 医学图像分割 区域增长

医学图像的三维重建与可视化&#xff0c;这是一个非常有趣且具有挑战性的课题&#xff01;在这样的项目中&#xff0c;可以探索不同的医学图像技术&#xff0c;比如MRI、CT扫描等&#xff0c;然后利用这些图像数据进行三维重建&#xff0c;并将其可视化以供医生或研究人员使用。…

C++中的继承与多态

一、继承&#xff1a; 1.什么是继承&#xff1f; 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段&#xff0c;它允许程序员在保持原有类特性的基础上进行扩展&#xff0c;增加功能&#xff0c;这样产生新的类&#xff0c;称派生类。继承呈现了面向对象…

golang map总结

目录 概述 一、哈希表原理 哈希函数 哈希表和哈希函数的关系 哈希表的优势 哈希冲突 什么是哈希冲突 如何处理哈希冲突 链表法 开放寻址法 哈希表常见操作过程 存储数据 检索数据 删除数据 常用的哈希算法 哈希表的应用场景 二、golang map map的内部结构 h…

c++智能指针(4)-- shared_ptr

概述 场景一: 希望指向多个指针管理一片空间 unique_ptr它是不允许两个智能指针管理一片空间的&#xff0c;所以其禁止直接拷贝和赋值(转化为右值可以)。 auto_ptr虽然其允许我们多个智能指针管理一片空间&#xff0c;但是这样的操作对于auto_ptr来说是不安全的&#xff0c;因…

Docker Volume (存储卷)

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

选课成绩管理系统

文章目录 员工管理系统一、项目演示二、项目介绍三、系统部分功能截图四、部分代码展示五、底部获取项目&#xff08;9.9&#xffe5;&#xff09; 员工管理系统 一、项目演示 课程管理系统 二、项目介绍 基于springbootvue的前后端分离选课成绩管理系统 该系统可做课程管理…

rpi-ws281x库测试介绍

彩色RGB灯测试-rpi-ws281x库使用 1 rpi-ws281x库介绍 rpi-ws281x 是一个针对 Raspberry Pi 的库&#xff0c;用于控制WS281X 系列 LED 灯带&#xff08;例如 WS2812B&#xff09;的颜色和亮度。它提供了一个 Python 接口&#xff0c;让你可以轻松地通过 Raspberry Pi 控制这些…

基础算法之二分算法

前言 本次博客&#xff0c;将要介绍二分算法的基本原理以及如何使用&#xff0c;深入浅出 二分可以针对整型以及浮点型接下来对其讲解希望对小白有所帮助吧 整型的二分法 一般要在一个数组中猜出一个数是否存在我们可以遍历一遍整个数组&#xff0c;判断是否存在&#xff0…

使用Windows11自带的WSL安装Ubuntu Linux系统教程

WSL介绍 WSL全称Windows Subsystem for Linux&#xff0c;它是Windows10带来的新特性&#xff0c;用于Windows系统上的Linux子系统。也就是说&#xff0c;可以在Windows系统中获取Linux系统&#xff0c;这个过程无需通过虚拟机&#xff0c;而是直连计算机硬件。 简而言之&#…

Linux--进程间的通信-命名管道

前文&#xff1a; Linux–进程间的通信-匿名管道 Linux–进程间的通信–进程池 命名管道的概念 命名管道是一种进程间通信&#xff08;IPC&#xff09;机制&#xff0c;运行不同进程之间进行可靠的、单向或双向的数据通信。 特点和作用&#xff1a; 跨平台性&#xff1a;在W…

ResNet最新变体!性能反超Transformer,模型准确率达98.42%

目前ResNet&#xff08;残差网络&#xff09;有两大主流创新思路&#xff1a;一是与其他技术或模型结合&#xff0c;比如前文讲到的ResNetTransformer&#xff1b;二是在原始设计的基础上进行改进。 尽管ResNet通过残差学习有效改善了深层网络的训练和性能&#xff0c;但同时它…

【LeetCode热题100】【堆】数据流的中位数

题目链接&#xff1a;295. 数据流的中位数 - 力扣&#xff08;LeetCode&#xff09; 不停插入元素要求找到每个状态的中位数&#xff0c;用两个堆&#xff0c;把中位数左边的数记为left&#xff0c;右边的数记为right&#xff0c;一个大顶堆记录小于等于中位数的left&#xff…

永磁同步电机无感FOC(扩展卡尔曼滤波EKF位置观测控制)

文章目录 1、前言2、扩展卡尔曼滤波器原理2.1 预测阶段&#xff08;时间更新阶段&#xff09;2.2 校正阶段&#xff08;状态更新阶段&#xff09; 3、永磁同步电机EKF的模型4、永磁同步电机EKF的无位置状态观测仿真4.1 核心模块&#xff08;在滑膜、龙伯格、磁链等观测器基础上…

数据库-Redis(10)

目录 46.Redis内存淘汰算法有哪些? 47.Redis内存用完了会发生什么? 48.Redis如何做内存优化?