前端学习<四>JavaScript基础——18-数组之隐秘

之前学习的数据类型,只能存储一个值(字符串也为一个值)。如果我们想存储多个值,就可以使用数组。

数组简介

数组(Array)是属于内置对象,数组和普通对象的功能类似,都可以用来存储一些值。不同的是:

  • 普通对象是使用字符串作为属性名,而数组是使用数字作为索引来操作元素。索引:从 0 开始的整数就是索引。

数组的存储性能比普通对象要好。在实际开发中我们经常使用数组存储一些数据(尤其是列表数据),使用频率非常高。

比如说,上面这个页面的列表数据,它的数据结构就是一个数组。

数组中的元素可以是任意的数据类型,可以是对象,可以是函数,也可以是数组。数组的元素中,如果存放的是数组,我们就称这种数组为二维数组。

接下来,我们讲一讲数组的基本操作。

创建数组对象

方式一:使用字面量创建数组

举例:

 let arr1 = []; // 创建一个空的数组
 ​
 let arr2 = [1, 2, 3]; // 创建带初始值的数组

方式一最简单,也用得最多。

方式二:使用构造函数创建数组

语法:

 let arr = new Array(参数);
 ​
 let arr = Array(参数);

如果参数为空,表示创建一个空数组;如果参数是一个数值,表示数组的长度;如果有多个参数,表示数组中的元素内容。

举个例子:

 // 方式一
 let arr1 = [11, 12, 13];
 ​
 // 方式二
 let arr2 = new Array(); // 参数为空:创建空数组
 let arr3 = new Array(4); // 参数为 size
 let arr4 = new Array(15, 16, 17); // 参数为多个数值:创建一个带数据的数组
 ​
 console.log(typeof arr1); // 打印结果:object
 ​
 console.log('arr1 = ' + JSON.stringify(arr1));
 console.log('arr2 = ' + JSON.stringify(arr2));
 console.log('arr3 = ' + JSON.stringify(arr3));
 console.log('arr4 = ' + JSON.stringify(arr4));

打印结果:

 object;
 ​
 arr1 = [11, 12, 13];
 arr2 = [];
 arr3 = [null, null, null, null];
 arr4 = [15, 16, 17];

从上方打印结果的第一行可以看出,数组的类型是属于对象

数组中的元素的类型

数组中可以存放任意类型的数据,例如字符串、数字、布尔值、对象等。

比如:

 const arr = ['qianguyihao', 28, true, { name: 'qianguyihao' }];

我们甚至可以在数组里存放数组。比如:

 const arr2 = [
     [11, 12, 13],
     [21, 22, 23],
 ];

数组的基本操作

数组的索引

索引 (下标) :用来访问数组元素的序号,代表的是数组中的元素在数组中的位置(下标从 0 开始算起)。

数组可以通过索引来访问、修改对应的数组元素。我们继续看看。

向数组中添加元素

语法:

 数组[索引] = 值;

代码举例:

 const arr = [];
 ​
 // 向数组中添加元素
 arr[0] = 10;
 arr[1] = 20;
 arr[2] = 30;
 arr[3] = 40;
 arr[5] = 50;
 ​
 console.log(JSON.stringify(arr));

打印结果:

[10,20,30,40,null,50]

获取数组中的元素

语法:

数组[索引];

如果读取不存在的索引(比如元素没那么多),系统不会报错,而是返回 undefined。

代码举例:

const arr = [21, 22, 23];

console.log(arr[0]); // 打印结果:21
console.log(arr[5]); // 打印结果:undefined

获取数组的长度

可以使用length属性来获取数组的长度(即“元素的个数”)。

数组的长度是元素个数,不要跟索引号混淆。

语法:

数组的长度 = 数组名.length;

代码举例:

const arr = [21, 22, 23];

console.log(arr.length); // 打印结果:3

补充:

对于连续的数组,使用 length 可以获取到数组的长度(元素的个数);对于非连续的数组(即“稀疏数组”,本文稍后会讲),length 的值会大于元素的个数。因此,尽量不要创建非连续的数组。

修改数组的长度

可以通过修改length属性修改数组的长度。

  • 如果修改的 length 大于原长度,则多出部分会空出来,置为 null。

  • 如果修改的 length 小于原长度,则多出的元素会被删除,数组将从后面删除元素。

  • (特例:伪数组 arguments 的长度可以修改,但是不能修改里面的元素,以后单独讲。)

代码举例:

const arr1 = [11, 12, 13];
const arr2 = [21, 22, 23];

// 修改数组 arr1 的 length
arr1.length = 1;
console.log(JSON.stringify(arr1));

// 修改数组 arr2 的 length
arr2.length = 5;
console.log(JSON.stringify(arr2));

打印结果:

[11]
[21, 22, 23, null, null]

遍历数组

遍历: 就是把数组中的每个元素从头到尾都访问一次。

最简单的做法是通过 for 循环,遍历数组中的每一项。举例:

const arr = [10, 20, 30, 40, 50];

for (let i = 0; i < arr.length; i++) {
    console.log(arr[i]); // 打印出数组中的每一项
}

下一篇文章,会学习数组的各种方法,到时候,会有更多的做法去遍历数组。

JS语言中,数组的注意点

和其他编程语言相比,JS语言中的数组比较灵活,有许多与众不同的地方。

1、如果访问数组中不存在的索引时,不会报错,会返回undefined。

2、当数组的存储空间不够时,数组会自动扩容。其它编程语言中数组的大小是固定的,不会自动扩容。

3、数组可以存储不同类型数据,其它编程语言中数组只能存储相同类型数据。

4、数组分配的存储空间不一定是连续的。其它语言数组分配的存储空间是连续的。

JS中的数组采用"哈希映射"的方式分配存储空间,我们可以通过索引找到对应空间。各大浏览器也对数组分配的存储空间进行了优化:如果存储的都是相同类型的数据,则会尽量分配连续的存储空间;如果存储的不是相同的数据类型,则不会分配连续的存储空间。

数组的解构赋值

解构赋值是ES6中新增的一种赋值方式。

ES5中,如果想把数组中的元素赋值给其他变量,是这样做的:

const arr = [1, 2, [3,4]];
let a = arr[0]; // 1
let b = arr[1]; // 2
let c = arr[2]; // [3, 4]

上面这种写法比较啰嗦。通过ES6中的结构复制,我们可以像下面这样做。

1、数组解构赋值,代码举例:

let [a, b, c] = [1, 2, [3, 4]];
console.log(a); // 1
console.log(b); // 2
console.log(c); // [3, 4]

注意点:

(1)等号左边的个数和格式,必须和右边的一模一样,才能完全解构。

(2)当然,左边的个数和右边的个数,可以不一样。

2、默认值。在赋值之前,我们可以给左边的变量指定默认值

let [a, b = 3, c = 4] = [1, 2];
console.log(a); // 1
console.log(b); // 2。默认值被覆盖。
console.log(c); // 4。继续保持默认值。

3、我们可以使用ES6中新增的扩展运算符打包剩余的数据。如果使用了扩展运算符, 那么扩展运算符只能写在最后。代码举例:

let [a, ...b] = [1, 2, 3];
console.log(a); // 1
console.log(b); // [2, 3]

稀疏数组与密集数组

这个知识点,简单了解即可。

  • 稀疏数组:索引不连续、数组长度大于元素个数的数组,可以简单理解为有 empty(有空隙)的数组。

  • 密集数组:索引连续、数组长度等于元素个数的数组。

参考链接:

  • JavaScript 之稀疏数组与密集数组

  • JS 稀疏数组

  • JS 中的稀疏数组和密集数组

  • [译]JavaScript中的稀疏数组与密集数组:https://www.cnblogs.com/ziyunfei/archive/2012/09/16/2687165.html

  • JavaScript || 数组

案例

例 1:翻转数组

代码实现:

const arr = [10, 20, 30, 40, 50]; // 原始数组
const newArr = []; // 翻转后的数组
for (let i = 0; i < arr.length; i++) {
    newArr[i] = arr[arr.length - i - 1];
}
console.log(JSON.stringify(newArr));

打印结果:

    [50,40,30,20,10]

例 2:冒泡排序

代码实现:

const arr = [20, 10, 50, 30, 40];
for (let i = 0; i < arr.length - 1; i++) {
    for (let j = 0; j < arr.length - i - 1; j++) {
        if (arr[j] > arr[j + 1]) {
            let temp = arr[j];
            arr[j] = arr[j + 1];
            arr[j + 1] = temp;
        }
    }
}
console.log(JSON.stringify(arr));

打印结果:

    [10,20,30,40,50]

赞赏作者

创作不易,你的赞赏和认可,是我更新的最大动力:

写在最后:希望大家可以点个关注点个赞,这对up真的很重要!谢谢!

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

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

相关文章

一文了解HTTPS的加密原理

HTTPS是一种安全的网络通信协议&#xff0c;用于在互联网上提供端到端的加密通信&#xff0c;确保数据在客户端&#xff08;如Web浏览器&#xff09;与服务器之间传输时的机密性、完整性和身份验证。HTTPS的加密原理主要基于SSL/TLS协议&#xff0c;以下详细阐述其工作过程&…

C语言易错知识点(3):字符数组的修改、sscanf、sprintf

字符数组是一个很细节的语法&#xff0c;涉及很多知识点&#xff0c;这篇文章我主要分享一下如何理解字符数组&#xff0c;以及对应的sscanf、sprintf有什么用 1.字符数组的初始化以及内容修改易错点 字符数组的初始化方式有两种&#xff0c;一种是直接用字符串进行初始化&am…

蓝桥杯第2152题——红绿灯

问题描述 爱丽丝要开车去上班, 上班的路上有许多红绿灯, 这让爱丽丝很难过。为 了上班不迟到, 她给自己的车安装了氮气喷射装置。现在她想知道自己上班最 短需要多少时间。 爱丽丝的车最高速度是 米每秒, 并且经过改装后, 可以瞬间加速到小于 等于最高速的任意速度, 也可以瞵…

(Java)数据结构——图(第五节)Kruskal的实现最小生成树(MST)

前言 本博客是博主用于复习数据结构以及算法的博客&#xff0c;如果疏忽出现错误&#xff0c;还望各位指正。 Kruskal算法&#xff08;Kruskal的实现原理&#xff09; Kruskal算法的原理&#xff1a; 就是每次取最小的边&#xff0c;看看是不是与已经选择的构成回路&#x…

imu6xl点灯(C语言)

参考正点原子开发指南 根据原理图可以看出&#xff0c;我们需要设置低电平导通电路。 在原理图上找到LED0&#xff0c;对应IO为GPIO3 IO复用配置 IMX6UL每个引脚都可以复用 在用户手册第30章可以找到IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03这个寄存器&#xff0c;地址为0x020E0068&…

洛谷-P1036 [NOIP2002 普及组] 选数

P1036 [NOIP2002 普及组] 选数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) #include<bits/stdc.h> using namespace std; const int N30; int n,r; int g[N]; //存用户输入的数 int arr[N]; //存答案 int res0; //存种类数bool is_prime(int y){ //求素数if(y<2){…

HarmonyOS实战开发-音视频录制、如何实现音频录制和视频录制功能的应用

介绍 音视频录制应用是基于AVRecorder接口开发的实现音频录制和视频录制功能的应用&#xff0c;音视频录制的主要工作是捕获音频信号&#xff0c;接收视频信号&#xff0c;完成音视频编码并保存到文件中&#xff0c;帮助开发者轻松实现音视频录制功能&#xff0c;包括开始录制…

2024年MCN商业模式运营体系行业发展分析

【干货资料持续更新&#xff0c;以防走丢】 2024年MCN商业模式运营体系行业发展分析 部分资料预览 资料部分是网络整理&#xff0c;仅供学习参考。 mcn运营资料包&#xff08;完整资料包含以下内容&#xff09; 目录 MCN机构运营方案的概要&#xff1a; 一、MCN机构定位与目…

Linux中安装seata

Linux中安装seata 一、准备1、环境2、下载3、上传到服务器4、解压 二、配置1、备份配置文件2、导入sql3、修改配置前4、修改配置后5、在nacos中配置 三、使用1、启动2、关闭 一、准备 1、环境 因为要在 nacos 中配置&#xff0c;要求安装并启动 nacos 。可以参考这篇博客。 …

接口优化技巧

一、背景 针对老项目&#xff0c;去年做了许多降本增效的事情&#xff0c;其中发现最多的就是接口耗时过长的问题&#xff0c;就集中搞了一次接口性能优化。本文将给小伙伴们分享一下接口优化的通用方案 二、接口优化方案总结 1.批处理 批量思想&#xff1a;批量操作数据库&a…

ObjectiveC-第一部分-基础入门-学习导航

专题地址:MacOS一站式程序开发系列专题 第一部分:基础入门学习导航 OSX-01-Mac OS应用开发概述:简单介绍下MacOS生态、Xcode使用以及使用Xcode创建app的方法OSX-02-Mac OS应用开发系列课程大纲和章节内容设计:介绍下此系列专题的文章内容组织形式以及此系列专题的覆盖内容…

《哈迪斯》自带的Lua解释器是哪个版本?

玩过《哈迪斯》&#xff08;英文名&#xff1a;Hades&#xff09;吗&#xff1f;最近在研究怎么给这款游戏做MOD&#xff0c;想把它的振动体验升级到更高品质的RichTap。N站下载了一些别人做的MOD&#xff0c;发现很多都基于相同的格式&#xff0c;均是对游戏.sjon文件或.lua文…

基于springboot smm vue的物流管理系统

本系统实现一个物流管理系统。具体功能描述如下&#xff1a; 系统其它信息管理&#xff1a;主要是针对系统的其他的信息进行管理&#xff0c;实现了系统的模块化的管理&#xff0c;系统的框架建设等信息的管理&#xff0c;具有系统的整合性功能的建立&#xff0c;支撑起整个系…

Deblurring 3D Gaussian Splatting去模糊3D高斯溅射

Abstract 摘要 Recent studies in Radiance Fields have paved the robust way for novel view synthesis with their photorealistic rendering quality. Nevertheless, they usually employ neural networks and volumetric rendering, which are costly to train and impede…

誉天教育近期开班计划

RHCA374 晚班 2024/4/15 数通HCIP 周末班 2024/4/20 RHCE 周末班 2024/4/20 云计算直通车 周末班 2024/4/20 欧拉HCIE 周末班 2024/4/20 存储HCIE 晚班 2024/4/22 云服务直通车 周末班 2024/4/27 安全HCIE 晚班 2024/5/6 云计算HCIE 晚班 2024/5/6 周末班&a…

一文涵盖Lambda,Stream,响应式编程,从此爱上高效率编程

一文涵盖Lambda,Stream,响应式编程&#xff0c;从此爱上高效率编程 前言 本文结构为 先是一个例子&#xff0c;带你快速体验&#xff0c;之后再去深究里面的方法。以及一些底层原理是如何实现的。从如何用&#xff0c;到如何用好&#xff0c;如何用精。学习操作&#xff0c;学…

代码随想录——二分查找(二)

模版 func binarySearch(nums []int, target int) int {l, r : 0, len(nums)-1for l < r {mid : l (r-l)/2if nums[mid] target {return mid} else if nums[mid] < target {l mid 1} else {r mid}}return -1 }例题 一.第一个错误的版本 代码&#xff1a; func fi…

GPT建模与预测实战

代码链接见文末 效果图&#xff1a; 1.数据样本生成方法 训练配置参数&#xff1a; --epochs 40 --batch_size 8 --device 0 --train_path data/train.pkl 其中train.pkl是处理后的文件 因此&#xff0c;我们首先需要执行preprocess.py进行预处理操作&#xff0c;配置参数…

SpringBoot入门(Hello World 项目)

SpringBoot关键结构 1.2.1 Core Container The Core Container consists of the Core, Beans, Context, and Expression Language modules. The Core and Beans modules provide the fundamental parts of the framework, including the IoC and Dependency Injection featur…

【嵌入式日志调试】嵌入式系统限制打印后使用echo定向到串口节点实现日志输出

背景 系统在启动业务进程时把输出定向到NULL&#xff0c;如./sample > /dev/null&#xff0c;正式版本的系统又是只读系统&#xff0c;不方便开放日志。然后又需要输出日志进行分析问题&#xff0c;系统不支持的情况&#xff0c;只改自己负责的进程实现日志打印 方案 步骤…