【前端】深入理解 JavaScript 中的数组与对象

news2025/1/10 23:40:40

在这里插入图片描述

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳]
本文专栏: 前端

文章目录

  • 💯前言
  • 💯数组与对象的基本概念
    • 数组(Array)
      • 数组示例
    • 对象(Object)
      • 对象示例
  • 💯数组与对象的对比
    • 核心区别
    • 如何选择:数组还是对象?
      • 数组中的对象:结合使用
  • 💯对象的下标访问与扩展
    • 下标访问的应用场景
      • 1. 动态键名访问
      • 2. 特殊字符键名
      • 3. 数字或非字符串键名
      • 4. 动态添加属性
      • 5. 迭代属性键和值
  • 💯`for...in` 遍历对象
    • 特点
      • 代码示例
    • 替代方式:现代对象遍历方法
      • 1. `Object.keys` 遍历键名
      • 2. `Object.values` 遍历值
      • 3. `Object.entries` 遍历键值对
  • 💯小结


在这里插入图片描述


💯前言

  • JavaScript 编程中,数组(Array)和对象(Object)是两种最常用且基础的数据结构。作为一种解释型、动态类型的编程语言,JavaScript 的灵活性赋予了这些结构广泛的适用性。在学术研究实践开发中,准确理解这两种结构的核心特点和最佳实践至关重要。本文旨在通过理论分析与代码示例的结合,为研究者与开发者提供对数组与对象的深入认识。
    JavaScript在这里插入图片描述

💯数组与对象的基本概念


数组(Array)

数组是一个有序的元素集合,每个元素通过数字索引(从 0 开始)访问。它是一种常用的数据结构,特别适合存储和操作有序列表。它的主要特点包括:

  • 有序性:数组中的元素是按顺序存储的,可以通过索引快速访问。
  • 长度属性:数组有一个 length 属性,表示数组的元素数量。
  • 适合存储列表:如商品清单、用户 ID、成绩单等。
  • 丰富的方法支持:如 pushpopmapfilterreduce 等,这些方法提供了强大的操作能力。

数组示例

const fruits = ["Apple", "Banana", "Cherry"];

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

// 添加新元素
fruits.push("Date");
console.log(fruits); // 输出: ["Apple", "Banana", "Cherry", "Date"]

// 数组长度
console.log(fruits.length); // 输出: 4

// 使用 map 方法生成新数组
const upperCaseFruits = fruits.map(fruit => fruit.toUpperCase());
console.log(upperCaseFruits); // 输出: ["APPLE", "BANANA", "CHERRY", "DATE"]

// 删除最后一个元素
const lastFruit = fruits.pop();
console.log(lastFruit); // 输出: Date
console.log(fruits); // 输出: ["Apple", "Banana", "Cherry"]

// 合并两个数组
const moreFruits = ["Elderberry", "Fig"];
const allFruits = fruits.concat(moreFruits);
console.log(allFruits); // 输出: ["Apple", "Banana", "Cherry", "Elderberry", "Fig"]

在这里插入图片描述


对象(Object)

对象是一个无序的键值对集合,每个值通过唯一的键名(字符串或符号)访问。它是一种灵活的数据结构,适合表示更复杂的实体或关联数据。其特点包括:

  • 无序性:对象的键值对存储顺序与定义顺序无关。
  • 灵活的键名:键名可以包含空格、特殊字符,甚至是动态生成的变量。
  • 适合存储结构化数据:如用户信息、配置项等。
  • 键值对存取方式:可以使用点语法或下标语法访问属性。

对象示例

const user = {
    name: "Alice",
    age: 25,
    city: "New York"
};

// 点语法访问属性
console.log(user.name); // 输出: Alice

// 下标语法访问属性
console.log(user["city"]); // 输出: New York

// 动态添加属性
user.email = "alice@example.com";
console.log(user);
// 输出: { name: "Alice", age: 25, city: "New York", email: "alice@example.com" }

// 删除属性
delete user.city;
console.log(user);
// 输出: { name: "Alice", age: 25, email: "alice@example.com" }

// 检查属性是否存在
console.log("age" in user); // 输出: true
console.log("city" in user); // 输出: false

在这里插入图片描述


💯数组与对象的对比


核心区别

特性数组 (Array)对象 (Object)
有序性是的,有序,通过索引访问否,无序,通过键名访问
索引0 开始的数字索引键名是字符串或符号类型
长度length 属性(如 array.length没有内置的长度属性
适用场景存储有序列表,比如用户 ID、商品列表存储无序数据,比如用户信息

如何选择:数组还是对象?

  • 使用数组的场景:

    • 数据是有序的,需要按索引访问或操作。
    • 需要利用数组的内置方法,如 mapfilterreduce 等。
    • 数据数量可能会频繁变动(如增加或删除元素)。
  • 使用对象的场景:

    • 数据是无序的,需要通过键名快速访问。
    • 表达复杂的实体,如用户、商品或配置信息。
    • 键名需要动态生成或包含特殊字符。

数组中的对象:结合使用

在实际开发中,经常需要将数组和对象结合使用。例如,存储多个用户的信息:

const users = [
    { name: "Alice", age: 25 },
    { name: "Bob", age: 30 },
    { name: "Charlie", age: 35 }
];

// 访问数组中某个对象的属性
console.log(users[0].name); // 输出: Alice

// 遍历数组
users.forEach(user => {
    console.log(`${user.name} is ${user.age} years old.`);
});
// 输出:
// Alice is 25 years old.
// Bob is 30 years old.
// Charlie is 35 years old.

// 过滤年龄大于30的用户
const olderUsers = users.filter(user => user.age > 30);
console.log(olderUsers);
// 输出: [ { name: "Charlie", age: 35 } ]

// 查找第一个年龄大于30的用户
const firstOlderUser = users.find(user => user.age > 30);
console.log(firstOlderUser);
// 输出: { name: "Charlie", age: 35 }

// 对所有用户的年龄加 1
const updatedUsers = users.map(user => ({ ...user, age: user.age + 1 }));
console.log(updatedUsers);
// 输出: [ { name: "Alice", age: 26 }, { name: "Bob", age: 31 }, { name: "Charlie", age: 36 } ]

在这里插入图片描述


💯对象的下标访问与扩展

虽然点语法是访问对象属性的常见方式,但对象也可以通过下标语法访问。这种方式为动态访问、特殊键名和动态属性添加提供了极大的灵活性。


下标访问的应用场景


1. 动态键名访问

当键名存储在变量中时,必须使用下标语法:

const key = "name";
const user = { name: "Alice", age: 25 };
console.log(user[key]); // 输出: Alice

在这里插入图片描述


2. 特殊字符键名

当键名包含空格或特殊字符时,点语法无法使用:

const user = {
    "first name": "Alice",
    "last-name": "Smith"
};

console.log(user["first name"]); // 输出: Alice
console.log(user["last-name"]);  // 输出: Smith

在这里插入图片描述


3. 数字或非字符串键名

尽管对象的键名会被自动转化为字符串,但仍然可以通过下标语法访问:

const obj = { 1: "one", 2: "two" };
console.log(obj[1]);       // 输出: one
console.log(obj["2"]);     // 输出: two

在这里插入图片描述


4. 动态添加属性

下标语法可以动态地为对象添加属性:

const user = {};
user["name"] = "Alice";
user["age"] = 25;

console.log(user); // 输出: { name: "Alice", age: 25 }

在这里插入图片描述


5. 迭代属性键和值

结合 Object.keysObject.entries 可以高效地迭代对象属性:

const user = { name: "Alice", age: 25, city: "New York" };

Object.entries(user).forEach(([key, value]) => {
    console.log(`${key}: ${value}`);
});
// 输出:
// name: Alice
// age: 25
// city: New York

在这里插入图片描述


💯for...in 遍历对象

for...in 是一种专门用来遍历对象属性的循环结构。

特点

  • 遍历对象的键名。
  • 无序:不能保证遍历顺序与属性定义顺序一致。
  • 适合对象而非数组(虽然可以遍历数组的索引,但不推荐)。

代码示例

const user = {
    name: "Alice",
    age: 25,
    city: "New York"
};

for (const key in user) {
    console.log(`${key}: ${user[key]}`);
}
// 输出:
// name: Alice
// age: 25
// city: New York

在这里插入图片描述


替代方式:现代对象遍历方法


1. Object.keys 遍历键名

const user = { name: "Alice", age: 25, city: "New York" };

Object.keys(user).forEach(key => {
    console.log(`${key}: ${user[key]}`);
});
// 输出:
// name: Alice
// age: 25
// city: New York

2. Object.values 遍历值

Object.values(user).forEach(value => {
    console.log(value);
});
// 输出:
// Alice
// 25
// New York

3. Object.entries 遍历键值对

Object.entries(user).forEach(([key, value]) => {
    console.log(`${key}: ${value}`);
});
// 输出:
// name: Alice
// age: 25
// city: New York

💯小结

  • 在这里插入图片描述
    数组和对象的选择:
    • 用数组存储有序数据列表,适用于操作列表、序列数据。
    • 用对象存储无序的键值对数据,适合表达更复杂的结构化信息。
  • 点语法 vs 下标语法:
    • 点语法简单直观,适合固定键名。
    • 下标语法灵活,适合动态键名或特殊字符键名。
  • 现代遍历方法: 使用 Object.keysObject.valuesObject.entries 是更现代和高效的选择。
  • 扩展练习: 多尝试数组与对象结合的应用场景,理解其各自优势。

通过以上内容,您应该能够更加全面地掌握 JavaScript 中数组和对象的核心概念与应用场景,并能够根据实际需求选择合适的数据结构和操作方式。

此外,灵活使用现代 JavaScript 特性,如解构赋值、扩展运算符和箭头函数,可以进一步提升代码的简洁性和可读性。这不仅有助于更高效地解决问题,也能让您在团队协作中写出更易于维护的代码。


在这里插入图片描述


在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

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

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

相关文章

31.下一个排列 python

下一个排列 题目题目描述示例 1:示例 2:示例 3:提示:题目链接 题解解题思路python实现代码解释:提交结果 题目 题目描述 整数数组的一个 排列 就是将其所有成员以序列或线性顺序排列。 例如,arr [1,2,3…

Codeforces Round 992 (Div. 2)

这场cf只在b卡了一下,因为b真是犯蠢了,我以为会向下取整,结果是完全就不取整,或者说是向上取整,卡了我半个小时,要不是紧急看了题一下,昨天那场就毁了 话不多说,直接开讲 A. Game …

vue入门实战(二)父子组件显示,参数传递

经过上次的写法&#xff0c;我们已经写出每个list项&#xff0c;现在要在每个父组件下面加入自己的子项 一、新建子组件&#xff1a; smallItem.vue&#xff1a; <script> export default{props:[text,id,status] //父组件传来的参数 } </script> <template>…

批量验证指定漏洞思路和流程

免责申明 本文仅是用于学习研究POC的地址收集与漏洞验证原理,请勿用在非法途径上,若将其用于非法目的,所造成的一切后果由您自行承担,产生的一切风险和后果与笔者无关;本文开始前请认真详细学习《‌中华人民共和国网络安全法》【学法时习之丨网络安全在身边一图了解网络安…

Android 事件分发机制详解/ 及Activity启动流程浅谈

目前网上的事件分发机制文章很多&#xff0c;可能大家看了很多&#xff0c;还是很懵逼&#xff0c;这篇文章是我自己总结的事件分发机制&#xff0c;提取了在事件分发机制中&#xff0c;最精华的部分&#xff0c;如果对事件分发还是不太清楚&#xff0c;可以看看这篇文章 更多…

蓝桥杯刷题日记02-小球反弹

问题描述 有一长方形&#xff0c;长为 343720343720 单位长度&#xff0c;宽为 233333233333 单位长度。在其内部左上角顶点有一小球 (无视其体积)&#xff0c;其初速度如图所示且保持运动速率不变&#xff0c;分解到长宽两个方向上的速率之比为 dx:dy15:17dx:dy15:17。小球碰…

SkyWalking 和 ELK 链路追踪实战

一、背景 最近在给项目搭建日志平台的时候&#xff0c;采用的方案是 SkyWalking ELK 日志平台&#xff0c;但发现 ELK 日志平台中的日志没有 Trace ID&#xff0c;导致无法追踪代码报错的整体链路。 空哥提示&#xff1a;Trace ID 是分布式追踪中用来唯一标识一个服务请求或事…

Ubuntu22.04深度学习环境安装【cuda+cudnn】

为了复现一篇深度学习论文&#xff0c;特意安装了Linux系统。前一天已经安装Linux显卡驱动&#xff0c;现在需要安装cuda、cudnn等。 论文代码 论文PDF 确定包版本&#xff1a; 根据论文提供的代码。在requirements.txt中发现cuda版本为11.7,cudnn为8.5.0&#xff0c;python没…

ue5 motion matching

ue5.5 gameanimationsample 先看动画蓝图 核心两个node 第一个是根据数据选择当前的pose 第二个是缓存一段历史记录&#xff0c;为第一个node选择的时候提供数据。 在animinstance的update方法中 每帧都更新这个函数&#xff0c;每帧更新trajectory的数据 看看第一个node的…

mycat2 分库分表

mycat2读写分离 mysql主从复制 mycat2 分库分表 实在 配置mycat2 读写分离 及主从复制的基础上完成的 以下所有操作 在mycat 登录后执行 一、配置分库分表数据源 name:数据名称 一般以以最后一个字母判断 r 是读 w是写 url&#xff1a; 真实数据源ip地址 理论上是每一个ip都…

python pandas数据处理,对比两个xlsx文档的两列数据做对比匹配,然后复制单元格值

1&#xff0c;文档数据 文档A 批次编号编号风险等级意见ps001code1低风险同意ps001code2中风险同意ps001code3低风险同意ps001code4低风险同意ps001code5低风险同意ps001code6低风险同意ps002code11低风险同意ps002code12中风险否决ps002code13低风险否决ps002code14低风险否决…

Pytorch 手写数字识别 深度学习基础分享

本篇是一次内部分享&#xff0c;给项目开发的同事分享什么是深度学习。用最简单的手写数字识别做例子&#xff0c;讲解了大概的原理。 手写数字识别 展示首先数字识别项目的使用。项目实现过程: 训练出模型准备html手写板flask 框架搭建简单后端 简单手写数字识别 深度学习必…

WPS EXCEL 使用 WPS宏编辑器 写32位十六进制数据转换为浮点小数的公式。

新建EXCLE文件 另存为xlsm格式的文件 先打开WPS的开发工具中的宏编辑器 宏编辑器编译环境 在工作区添加函数并编译&#xff0c;如果有错误会有弹窗提示&#xff0c;如果没有错误则不会弹 函数名字 ”HEXTOFLOAT“ 可以自己修改。 function HEXTOFLOAT(hex) { // 将十六…

沃丰科技智能客服在跨境电商独立站中的核心角色

随着全球化进程的加速和互联网技术的不断发展&#xff0c;跨境电商行业蓬勃兴起&#xff0c;为消费者提供了更广阔、更便捷的购物选择。在这样一个竞争激烈的市场环境中&#xff0c;优质的客户服务成为了企业脱颖而出的关键。沃丰科技智能客服凭借其先进的技术和人性化的设计理…

langgraph实现无观测推理 (Reasoning without Observation)

图例 1. 图状态 在 LangGraph 中&#xff0c;每个节点都会更新一个共享的图状态。当任何节点被调用时&#xff0c;状态就是该节点的输入。 下面&#xff0c;我们将定义一个状态字典&#xff0c;用以包含任务、计划、步骤和其他变量。 from typing import List from typing…

2024企业数据资产入表合规指引——解读

更多数据资产资讯关注公众&#xff1a;数字化转型home 本报告旨在为企业数据资产入表提供合规保障。随着数字经济的发展&#xff0c;数据资产已成为重要战略资源和新生产要素。财政部发布的《企业数据资源相关会计处理暂行规定》明确&#xff0c;自2024年1月1日起&#xff0c;数…

19,[极客大挑战 2019]PHP1

这个好玩 看到备份网站字眼&#xff0c;用dirsearch扫描 在kali里打开 找出一个www.zip文件 访问一下 解压后是这个页面 class.php <?php include flag.php; error_reporting(0); class Name{ private $username nonono; private $password yesyes; public …

计算机键盘简史 | 键盘按键功能和指法

注&#xff1a;本篇为 “计算机键盘简史 | 键盘按键功能和指法” 相关文章合辑。 英文部分机翻未校。 The Evolution of Keyboards: From Typewriters to Tech Marvels 键盘的演变&#xff1a;从打字机到技术奇迹 Introduction 介绍 The keyboard has journeyed from a humb…

《Clustering Propagation for Universal Medical Image Segmentation》CVPR2024

摘要 这篇论文介绍了S2VNet&#xff0c;这是一个用于医学图像分割的通用框架&#xff0c;它通过切片到体积的传播&#xff08;Slice-to-Volume propagation&#xff09;来统一自动&#xff08;AMIS&#xff09;和交互式&#xff08;IMIS&#xff09;医学图像分割任务。S2VNet利…

HarmonyOS(65) ArkUI FrameNode详解

Node 1、Node简介2、FrameNode2.1、创建和删除节点2.2、对FrameNode的增删改2.3、 FramNode的查询功能3、demo源码4、总结5、参考资料1、Node简介 在HarmonyOS(63) ArkUI 自定义占位组件NodeContainer介绍了自定义节点复用的原理(阅读本本篇博文之前,建议先读读这个),在No…