第三部分:进阶概念 7.数组与对象 --[JavaScript 新手村:开启编程之旅的第一步]

第三部分:进阶概念 7.数组与对象 --[JavaScript 新手村:开启编程之旅的第一步]

在 JavaScript 中,数组和对象是两种非常重要的数据结构,它们用于存储和组织数据。尽管它们都属于引用类型(即它们存储的是对数据的引用而不是数据本身),但它们有着不同的特性和用途。

创建和访问数组

当然,下面是四个关于如何在 JavaScript 中创建和访问数组的示例。这些示例涵盖了不同的创建方法以及访问数组元素的方式。

示例 1: 使用数组字面量创建并访问数组

这是最简单且常用的方法来创建一个数组,并通过索引访问其元素。

// 创建一个包含水果名称的数组
const fruits = ['apple', 'banana', 'orange'];

// 访问数组中的第一个元素
console.log(fruits[0]); // 输出: apple

// 修改数组中的第二个元素
fruits[1] = 'grape';

// 打印整个数组
console.log(fruits); // 输出: ["apple", "grape", "orange"]

在这里插入图片描述

示例 2: 使用 Array 构造函数创建数组

你可以使用 Array 构造函数来创建数组。注意,如果只传递一个数字参数给构造函数,则会创建一个具有指定长度但未初始化的数组。

// 创建一个包含数字的数组
const numbers = new Array(1, 2, 3, 4, 5);

// 访问数组中的最后一个元素
console.log(numbers[numbers.length - 1]); // 输出: 5

// 添加新元素到数组末尾
numbers.push(6);

// 打印整个数组
console.log(numbers); // 输出: [1, 2, 3, 4, 5, 6]

在这里插入图片描述

示例 3: 使用数组方法创建和访问多维数组

有时你需要创建一个多维数组(即数组中的每个元素本身也是一个数组),这可以通过嵌套数组来实现。

// 创建一个多维数组
const matrix = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
];

// 访问二维数组中的特定元素
console.log(matrix[1][1]); // 输出: 5 (第二行第二列)

// 修改二维数组中的元素
matrix[0][2] = 'X';

// 打印修改后的整个数组
console.log(matrix); // 输出: [[1, 2, "X"], [4, 5, 6], [7, 8, 9]]

在这里插入图片描述

示例 4: 使用数组填充方法创建并访问大数组

JavaScript 提供了一些便捷的方法来创建大型或特定模式的数组,例如 Array.from()fill() 方法。

// 使用 Array.from() 创建一个从 1 到 5 的数组
const sequence = Array.from({ length: 5 }, (_, i) => i + 1);

// 访问数组中的所有元素
console.log(sequence); // 输出: [1, 2, 3, 4, 5]

// 使用 fill() 方法创建一个填充相同值的数组
const filledArray = new Array(3).fill('same');

// 访问数组中的所有元素
console.log(filledArray); // 输出: ["same", "same", "same"]

// 使用 map() 方法创建一个基于现有数组的新数组
const doubled = sequence.map(x => x * 2);

// 打印新的数组
console.log(doubled); // 输出: [2, 4, 6, 8, 10]

在这里插入图片描述

总结
  • 示例 1 展示了如何使用数组字面量创建数组,并通过索引访问和修改元素。
  • 示例 2 演示了 Array 构造函数的用法,包括添加新元素。
  • 示例 3 展现了多维数组的创建和访问方式。
  • 示例 4 介绍了几种创建和操作大型或模式化数组的方法,如 Array.from()fill()

这些示例覆盖了 JavaScript 数组的基本创建和访问技巧,帮助你更好地理解和应用这一重要的数据结构。

数组方法概览

JavaScript 提供了丰富的数组方法,使得操作数组变得非常方便。以下是四个常见的数组方法及其使用示例,涵盖了一些最常用的功能,如遍历、查找、过滤和转换数组元素。

示例 1: 使用 forEach 遍历数组

forEach 方法用于对数组中的每个元素执行一次提供的函数,但不返回任何值(即返回 undefined)。

const numbers = [1, 2, 3, 4, 5];

// 使用 forEach 遍历数组并打印每个元素
numbers.forEach((number) => {
    console.log(number);
});

// 输出:
// 1
// 2
// 3
// 4
// 5

在这里插入图片描述

示例 2: 使用 map 创建新数组

map 方法创建一个新数组,其结果是对调用数组中的每个元素调用提供的函数后的返回值。

const numbers = [1, 2, 3, 4, 5];

// 使用 map 将每个元素乘以 2,并创建一个新的数组
const doubled = numbers.map((number) => number * 2);

console.log(doubled); // 输出: [2, 4, 6, 8, 10]

在这里插入图片描述

示例 3: 使用 filter 筛选数组元素

filter 方法创建一个新数组,包含所有通过测试的元素。原数组不会被改变。

const numbers = [1, 2, 3, 4, 5, 6];

// 使用 filter 找出所有偶数
const evens = numbers.filter((number) => number % 2 === 0);

console.log(evens); // 输出: [2, 4, 6]

在这里插入图片描述

示例 4: 使用 reduce 计算数组的总和或聚合数据

reduce 方法对数组中的每个元素(从左到右)执行一个提供的 reducer 函数,将其结果汇总为单个输出值。

const numbers = [1, 2, 3, 4, 5];

// 使用 reduce 计算数组中所有元素的总和
const sum = numbers.reduce((accumulator, currentValue) => accumulator + currentValue, 0);

console.log(sum); // 输出: 15

// 使用 reduce 计算对象数组中特定属性的总和
const orders = [
    { id: 1, amount: 200 },
    { id: 2, amount: 450 },
    { id: 3, amount: 300 }
];

const totalAmount = orders.reduce((sum, order) => sum + order.amount, 0);

console.log(totalAmount); // 输出: 950

在这里插入图片描述

总结
  • forEach:遍历数组,对每个元素执行指定的操作,但不返回新数组。
  • map:创建一个新数组,其中包含对原始数组中每个元素应用函数后的结果。
  • filter:创建一个新数组,包含所有满足给定条件的元素。
  • reduce:将数组中的元素累积成一个单一的值,常用于求和或聚合操作。

这些方法是处理数组时最常用的工具之一,它们不仅简化了代码,还提高了可读性和效率。通过组合使用这些方法,你可以更灵活地操作和处理数组数据。

对象的创建与属性访问

在 JavaScript 中,对象是存储键值对(即属性和方法)的数据结构。它们是非常灵活且强大的工具,用于组织和操作数据。下面是四个关于如何创建对象以及访问其属性的示例。

示例 1: 使用对象字面量创建对象并访问属性

这是最简单的方法来创建一个对象,并通过点符号或方括号语法访问其属性。

// 创建一个表示人的对象
const person = {
    firstName: 'John',
    lastName: 'Doe',
    age: 30,
    getFullName: function() {
        return `${this.firstName} ${this.lastName}`;
    }
};

// 访问对象属性
console.log(person.firstName); // 输出: John
console.log(person['lastName']); // 输出: Doe

// 调用对象方法
console.log(person.getFullName()); // 输出: John Doe

在这里插入图片描述

示例 2: 使用构造函数创建对象实例

你可以定义一个构造函数,然后使用 new 关键字来创建该构造函数的多个实例。

// 定义一个构造函数
function Person(firstName, lastName, age) {
    this.firstName = firstName;
    this.lastName = lastName;
    this.age = age;
    this.getFullName = function() {
        return `${this.firstName} ${this.lastName}`;
    };
}

// 创建构造函数的实例
const john = new Person('John', 'Doe', 30);
const jane = new Person('Jane', 'Smith', 25);

// 访问实例属性
console.log(john.firstName); // 输出: John
console.log(jane.getFullName()); // 输出: Jane Smith

在这里插入图片描述

示例 3: 使用 class 语法创建对象

ES6 引入了类(class)语法,它提供了一种更简洁的方式来定义构造函数和方法。

// 定义一个类
class Person {
    constructor(firstName, lastName, age) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.age = age;
    }

    getFullName() {
        return `${this.firstName} ${this.lastName}`;
    }
}

// 创建类的实例
const john = new Person('John', 'Doe', 30);
const jane = new Person('Jane', 'Smith', 25);

// 访问实例属性
console.log(john.firstName); // 输出: John
console.log(jane.getFullName()); // 输出: Jane Smith

在这里插入图片描述

示例 4: 使用 Object.create 方法创建对象

Object.create 方法允许你基于现有的对象创建新对象,并指定原型对象。这对于实现继承非常有用。

// 创建一个原型对象
const personPrototype = {
    getFullName: function() {
        return `${this.firstName} ${this.lastName}`;
    }
};

// 使用 Object.create 基于原型对象创建新对象
const john = Object.create(personPrototype);
john.firstName = 'John';
john.lastName = 'Doe';
john.age = 30;

const jane = Object.create(personPrototype);
jane.firstName = 'Jane';
jane.lastName = 'Smith';
jane.age = 25;

// 访问对象属性
console.log(john.firstName); // 输出: John
console.log(jane.getFullName()); // 输出: Jane Smith

在这里插入图片描述

总结
  • 对象字面量:最简单的方式创建对象,适合单个对象的快速定义。
  • 构造函数:适合需要创建多个相似对象的情况,提供了初始化参数。
  • class 语法:ES6 提供的更简洁、面向对象的语法,便于定义构造函数和方法。
  • Object.create:基于现有对象创建新对象,有助于实现原型链继承。

这些方法展示了不同情况下创建和操作 JavaScript 对象的方式,每种方法都有其适用场景和优点。根据具体需求选择合适的方法,可以使代码更加清晰和高效。

遍历对象

JavaScript 遍历对象的三种常见方法

遍历对象是指访问对象的所有属性(键值对)。JavaScript 提供了多种方式来实现这一点,下面将介绍三种常见的方法,并附带示例代码。

示例 1: 使用 for...in 循环遍历对象属性

for...in 循环可以遍历对象的所有可枚举属性,包括继承的属性。如果你只想遍历对象自身的属性,应该使用 hasOwnProperty() 方法进行过滤。

const person = {
    firstName: 'John',
    lastName: 'Doe',
    age: 30,
    occupation: 'Developer'
};

// 使用 for...in 遍历对象属性
for (let key in person) {
    if (person.hasOwnProperty(key)) { // 确保只遍历自身属性
        console.log(`${key}: ${person[key]}`);
    }
}

// 输出:
// firstName: John
// lastName: Doe
// age: 30
// occupation: Developer

在这里插入图片描述

示例 2: 使用 Object.keys()forEach 遍历对象键

Object.keys() 方法返回一个包含对象所有自身属性键的数组,然后你可以使用数组的方法如 forEach 来遍历这些键。

const person = {
    firstName: 'John',
    lastName: 'Doe',
    age: 30,
    occupation: 'Developer'
};

// 使用 Object.keys() 和 forEach 遍历对象键
Object.keys(person).forEach(key => {
    console.log(`${key}: ${person[key]}`);
});

// 输出:
// firstName: John
// lastName: Doe
// age: 30
// occupation: Developer

在这里插入图片描述

示例 3: 使用 Object.entries() 和解构赋值遍历键值对

Object.entries() 方法返回一个给定对象自身所有 [key, value] 对的数组迭代器。结合 for...offorEach 可以方便地同时获取键和值。

const person = {
    firstName: 'John',
    lastName: 'Doe',
    age: 30,
    occupation: 'Developer'
};

// 使用 Object.entries() 和解构赋值遍历键值对
for (let [key, value] of Object.entries(person)) {
    console.log(`${key}: ${value}`);
}

// 或者使用 forEach
Object.entries(person).forEach(([key, value]) => {
    console.log(`${key}: ${value}`);
});

// 输出:
// firstName: John
// lastName: Doe
// age: 30
// occupation: Developer

在这里插入图片描述

总结
  • for...in:适合遍历对象的所有可枚举属性,但需要注意区分自身属性和继承属性。
  • Object.keys() + 数组方法:通过将对象键转换为数组,利用数组的遍历方法,清晰且易于操作。
  • Object.entries():提供了一种简洁的方式来同时获取键和值,特别适用于需要同时处理键和值的场景。

选择哪种方法取决于具体的需求和偏好。上述三种方法都是有效且常用的遍历对象的方式,可以帮助你根据实际情况选择最适合的一种。

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

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

相关文章

Redis设计与实现读书笔记

目录 Redis设计与实现[^1]第一部分:数据结构与对象简单动态字符串SDS的基础定义与C字符串的差别常数获取长度杜绝缓冲区溢出减少修改字符串时带来的内存重分配次数二进制安全函数兼容 链表链表和链表节点的实现 字典字典的实现哈希表定义哈希表节点定义字典定义 哈希…

笔记04--零基础创建个人本地大模型知识库ollama+Dify

ollma安装 官网下载直接下一步下一步即可,没有魔法的朋友可以留言,文章中所用到的文件也给打包了,大家可以直接下载使用通过云盘下载使用。 链接: https://pan.baidu.com/s/12zF9MpQtg1bnMDAQayaSyg 提取码: n9rm 官网地址:http…

基于Springboot的校园交友网站设计与实现

1.1 管理信息系统概述 管理信息系统是计算机在信息管理领域的一种实用技术。通过运用管理科学、数学和计算机应用的原理及方法,在符合软件工程规范的原则下,形成一套完整的理论和方法体系。是一个以人、计算机和其他外部设备组成的可以进行信息的收集、…

Vue智慧商城项目

创建项目 vue组件库 — vant-ui(常用于移动端) Vant 2 - 轻量、可靠的移动端组件库 安装vant npm i vantlatest-v2 -S 引入组件 按需导入和全部导入 全部导入 整个组件库的所有组件都导进来,缺点是增加了代码包体积 main.js import…

灵途科技亮相2024世界传感器大会 分享光纤光源技术突破

12月1日至2日,2024世界传感器大会(WSS)在郑州国际会展中心隆重举办,泛自动驾驶领域光电感知专家灵途科技受邀参加“光纤传感器与激光雷达”分论坛,并在大会上带来《激光雷达用一体化光纤光源》专题演讲,同与…

【kotlin 】内联类(value class / inline class)

官方文档:https://kotlinlang.org/docs/inline-classes.html 注:inline class 关键字已经被废弃,取而代之的是value class。现在使用内联类需要定义类为value class,并使用JvmInline注解进行标注。 一、使用场景 有时候&#xff…

基于LSTM的A股股票价格预测系统(torch) :从数据获取到模型训练的完整实现

1. 项目简介 本文介绍了一个使用LSTM(长短期记忆网络)进行股票价格预测的完整系统。该系统使用Python实现,集成了数据获取、预处理、模型训练和预测等功能。 这个代码使用的是 LSTM (Long Short-Term Memory) 模型,这是一种特殊的…

【python自动化五】接口自动化基础--requests的使用

python的接口请求可以用requests库,这个介绍就不多说了,网上说得很详细。 接下来直接记录下如何使用(当然也不限于自动化的使用) 1.安装requests requests也需要安装一下 pip install requests2.requests请求 1.常用的请求方法…

【NLP 5、深度学习的基本原理】

目录 一、梯度下降算法 1.引例 —— 找极小值问题 目标: 方法: 2.梯度 例: 3.求解目标 为什么损失函数越小越好 4.梯度下降法 代码实现 5.细节问题 6.梯度爆炸和梯度消失 梯度爆炸 梯度消失 7.过拟合和欠拟合 欠拟合(Underfitting…

DAY168内网对抗-基石框架篇单域架构域内应用控制成员组成用户策略信息收集环境搭建

知识点: 1、基石框架篇-单域架构-权限控制-用户和网络 2、基石框架篇-单域架构-环境搭建-准备和加入 3、基石框架篇-单域架构-信息收集-手工和工具 1、工作组(局域网) 将不同的计算机按照功能分别列入不同的工作组。想要访问某个部门的资源,只要在“…

MATLAB 建筑顶面面积计算(95)

MATLAB 建筑顶面面积计算(95) 一、算法介绍二、算法实现1.代码2.结果一、算法介绍 根据给出的建筑顶面点云,计算建筑面积,具体的方法实现和结果如下: 二、算法实现 1.代码 代码如下(示例): % 从 PLY 文件读取点云数据 filename = D:\shuju\屋顶2.ply; % 替换为你的…

Mac M1 安装数据库

1. Docker下载 由于Sqlserver和达梦等数据库,不支持M系列的芯片,所以我们通过docker安装 下载并安装docker: https://www.docker.com/get-started/ 安装完成后,打开docker 2. SQL Server 安装 2.1 安装 打开终端,执行命令 doc…

二十(GIT3)、echarts(折线图、柱状图、饼图)、黑马就业数据平台(主页图表实现、闭包了解、学生信息渲染)

1. echarts 数据可视化:将数据转换为图形,数据特点更加突出 echarts:一个基于 JavaScript 的开源可视化图表库 echarts官网 1.1 echarts核心使用步骤 // 1. 基于准备好的dom,初始化echarts实例 const myChart echarts.init…

软考高级架构-9.4.4-双机热备技术 与 服务器集群技术

一、双机热备 1、特点: 软硬件结合:系统由两台服务器(主机和备机)、一个共享存储(通常为磁盘阵列柜)、以及双机热备软件(提供心跳检测、故障转移和资源管理功能的核心软件)组成。 …

【Java若依框架】RuoYi-Vue的前端和后端配置步骤和启动步骤

🎙告诉你:Java是世界上最美好的语言 💎比较擅长的领域:前端开发 是的,我需要您的: 🧡点赞❤️关注💙收藏💛 是我持续下去的动力! 目录 一. 作者有话说 …

Kubernetes Nginx-Ingress | 禁用HSTS/禁止重定向到https

目录 前言禁用HSTS禁止重定向到https关闭 HSTS 和设置 ssl-redirect 为 false 的区别 前言 客户请求经过ingress到服务后,默认加上了strict-transport-security,导致客户服务跨域请求失败,具体Response Headers信息如下; 分析 n…

小程序入门学习(八)之页面事件

一、下拉刷新新事件 1. 什么是下拉刷新 下拉刷新是移动端的专有名词,指的是通过手指在屏幕上的下拉滑动操作,从而重新加载页面数据的行为。 2. 启用下拉刷新 启用下拉刷新有两种方式: 全局开启下拉刷新:在 app.json 的 window…

C++(十二)

前言: 本文将进一步讲解C中,条件判断语句以及它是如何运行的以及内部逻辑。 一,if-else,if-else语句。 在if语句中,只能判断两个条件的变量,若想实现判断两个以上条件的变体,就需要使用if-else,if-else语…

[Linux]文件属性和权限

目录 一.Linux文件的属性二.Linux用户权限分类三.文件权限的查询与修改1.修改用户的权限1).一般法2).8进制法 2.修改所属组和所属者3.如何在创建文件时权限预分配 在学习linux的时候,我们用ll命令显示文件的详情信息,难免会发现文件名前面会有一大堆其它…

ElK 8 收集 MySQL 慢查询日志并通过 ElastAlert2 告警至飞书

文章目录 1. 说明2. 启个 mysql3. 设置慢查询4. filebeat 设置5. 触发慢查询6. MySQL 告警至飞书 1. 说明 elk 版本:8.15.0 2. 启个 mysql docker-compose.yml 中 mysql: mysql:# restart: alwaysimage: mysql:8.0.27# ports:# - "3306:3306&q…