探索优雅的处理 JavaScript 类数组对象的技巧

26个写出简洁优雅JavaScript代码的技巧 请注意,如果您使用它们,您的函数将只为未定义的参数提供默认值。它的代码易于理解,没有多余的部分,简单,并且可以通过测试。为了帮助你编写出色的 JavaScript 代码,我将在今天的内容中与你分享 26 个写干净代码的技巧,这些技巧将指导你编写既优雅又高效的代码。Promise 是回调的一个非常干净的替代方案,但 ES2017/ES8 带来了 async 和 wait,它提供了更干净的解决方案。 阅读详情

一. 引言

在 JavaScript 编程中,我们经常遇到类数组对象,它们拥有类似数组的结构和行为,但却不具备真正的数组方法和属性。常见的类数组对象包括 DOM 集合、函数的 arguments 对象和字符串等。如果我们想对这些类数组对象进行操作和处理,我们需要掌握一些优雅的技巧。

处理类数组对象的见方法有循环迭代、转换为数组、使用数组方法、使用 Array.prototype 方法、使用解构赋值以及其他一些殊情况的处理。本篇文章中,我们将介绍这些方法,并给出一些实用的示例。

通过优雅地处理类数组对象,我们可以更加灵活地操作和处理数据,从而提高开发效率和代码质量。无论是处理 DOM 元素、函数参数还是字符串,了解这些优雅的技巧都能让我们更游刃有余。

接下来让我们一起来认识如何优雅地处理类数组对象,实现 JavaScript 神奇的转变!

二. 了解类数组对象

1. 什么是类数组对象

类数组对象是指在 JavaScript 中具有类似数组的特点,但并非真正的数组。它们与数组相似,可以通过索引访问元素,并且具有length属性来表示元素的个数。但与真正的数组不同,类数组对象不具备数组原型链上的方法和属性。

例如:

const obj = {
  0: "apple",
  1: "banana",
  2: "orange",
  length: 3,
};

console.log(obj.length); // 输出: 3

2. 常见的类数组对象

(1)arguments对象:在函数内部可用的特殊对象,存储了函数参数的类数组对象。

function sum() {
  console.log(arguments);
}

sum(1, 2, 3); // Arguments(3) [1,2, 3, callee: f, Symbol(Symbol.iterator): f]


(2)NodeList对象:DOM 元素的集合,通过像document.querySelectorAll()方法获取

<ul id="list" style="width: 100px; margin: 0; float: left">
  <li>1</li>
  <li>2</li>
  <li>3</li>
  <li>4</li>
</ul>

<script>
  const paragraphs = document.querySelectorAll("li");
  console.log(paragraphs.length); // 输出: 指定选择器的li元素个数
  console.log(paragraphs); // 输出: 指定选择器的li元素
  console.log(paragraphs[0]); // 输出: 第一个li元素
</script>


(3)HTMLCollection对象:表示一组 DOM 元素的集合,例如通过类似getElementsByClassName、getElementsByTagName等方法获取的元素集合。

<button class="btn">第一个按钮</button>
<button class="btn">第二个按钮</button>

<script>
  const buttons = document.getElementsByClassName("btn");
  console.log(buttons.length); // 输出: 指定类名的按钮元素个数
  console.log(buttons); // 输出: 指定类名的按钮元素
  console.log(buttons[0]); // 输出: 指定索引的按钮元素
</script>


(4)TypedArray对象:表示一定长度的二进制数据缓冲区的类数组对象,例如Int8Array、Uint8Array等。

const buffer = new ArrayBuffer(8); // 创建一个8字节的缓冲区
const intArray = new Int32Array(buffer); // 使用Int32Array视图包装缓冲区

console.log(intArray);
console.log(intArray[0]); // 输出: 0

intArray[0] = 42;
console.log(intArray);
console.log(intArray[0]); // 输出: 42


(5)FileList:表示一组文件的集合,通常来自于文件上传 input 元素

<input type="file" multiple="true" />

<script>
  window.onload = function (event) {
    init();
  };
  function init() {
    const fileInput = document.querySelector('input[type="file"]');
    fileInput.onchange = onFileChange;
  }
  function onFileChange(event) {
    const files = event.target.files;
    console.log(files.length); // 输出: 选择的文件数量
    console.log(files); // 输出: 所有文件对象
    console.log(files[0]); // 输出: 第一个文件对象
  }
</script>

这些类数组对象都可以通过索引访问元素,并且具有length属性,但不具备数组原型链上的方法和属性。如果需要使用数组的方法和属性,可以将类数组对象转换为真正的数组,例如通过Array.from、Array.prototype.slice.call、Array.prototype.concat等方法。

三. 类数组对象的特性

这些特性使得类数组对象在某些场景下非常有用,例如处理函数参数(arguments对象),DOM 操作中获取的元素集合(HTMLCollection对象和NodeList对象)等。

1. 索引访问和写入

类数组对象可以通过索引访问元素,读取或者写入数据。可以使用中括号([])操作符来读写类数组对象中的元素。

示例代码:

const obj = {
  0: "apple",
  1: "banana",
  2: "orange",
  length: 3,
};

console.log(obj[0]); // 输出: "apple"
console.log(obj[1]); // 输出: "banana"

obj[2] = "grape";
console.log(obj[2]); // 输出: "grape"

2. 长度属性

类数组对象具有length属性,用于表示对象中元素的个数。可以通过访问length属性来获取类数组对象中元素的数量。

示例代码:

const obj = {
  0: "apple",
  1: "banana",
  2: "orange",
  length: 3,
};

console.log(obj.length); // 输出: 3

3. 迭代类数组对象

类数组对象可以使用迭代方法进行遍历操作,可以使用for循环对其进行迭代操作。或者通过一些方法先将其转换成数组,在对其进行迭代也是可以的!

示例代码:

const obj = {
  0: "apple",
  1: "banana",
  2: "orange",
  length: 3,
};

for (let index = 0; index < obj.length; index++) {
  const element = obj[index];
  console.log(element);
}

使用 for 循环迭代类数组的输出入下图所示:

注意:通过迭代方法进行遍历操作时,最好先将类数组对象转换为真正的数组,以避免出现一些问题。

四. 类数组对象 VS 真正的数组

类数组对象与真正的数组在以下两个方面存在区别:

1. 原型链上的方法和属性

真正的数组具有数组对象的原型链,因此具有丰富的方法和属性,如push、pop、shift、unshift等用于操作数组的方法,以及length、concat、slice等用于处理数组的属性和方法。而类数组对象并没有这些原型方法和属性,使用类数组对象时不能直接调用数组的方法和属性。

示例代码:

const arr = [1, 2, 3];
const obj = {
  0: 1,
  1: 2,
  2: 3,
  length: 3,
};

console.log(arr.push(4)); // 输出: 4
console.log(obj.push(4)); // 报错: obj.push is not a function

console.log(arr.length); // 输出: 4
console.log(obj.length); // 输出: 3

2. 结构差异

类数组对象与真正的数组在内部结构上存在差异。真正的数组是一段连续的内存空间,可以直接通过索引访问到每个元素,而类数组对象并非连续的内存空间,且可能具有非数字索引。类数组对象通常是基于对象实现的,使用非数字索引作为键来存储元素。因此,类数组对象的内部结构与真正的数组不同。

示例代码:

const arr = [1, 2, 3];
const obj = {
  0: 1,
  1: 2,
  2: 3,
  length: 3,
};

console.log(arr[0]); // 输出: 1
console.log(obj[0]); // 输出: 1

console.log(arr[3]); // 输出: undefined
console.log(obj[3]); // 输出: undefined

console.log(arr); // 输出: [1, 2, 3]
console.log(obj); // 输出: {0: 1, 1: 2, 2: 3, length: 3}

总结:尽管类数组对象与真正的数组在某些方面类似,但在原型链上的方法和属性、内部结构方面存在差异。因此,在使用类数组对象时需要注意这些区别,需要根据实际需求进行相应的处理。如有需要,可以将类数组对象转换为真正的数组,以便能够使用数组的方法和属性来操作数据。

五. 处理类数组对象的常见方法

假如有一个类数组对象,如下所示:

const obj = {
  0: "apple",
  1: "banana",
  2: "orange",
  length: 3,
};

下面总结处理以上这个类数组对象的几种方式:

1. 使用数组展开运算符(...)

const arr = [...obj];
console.log(arr); // 输出: ["apple", "banana", "orange"]

2. 使用 Array.from()方法

const arr = Array.from(obj);
console.log(arr); // 输出: ["apple", "banana", "orange"]

3. 使用 Array.prototype.slice.call()方法

const arr = Array.prototype.slice.call(obj);
console.log(arr); // 输出: ["apple", "banana", "orange"]

4. 使用 Array.prototype.map.call()方法

const arr = Array.prototype.map.call(obj, (item) => item);
console.log(arr); // 输出: ["apple", "banana", "orange"]

5. 使用 ES6 的 Array.from()方法与箭头函数

const arr = Array.from(obj, (item) => item);
console.log(arr); // 输出: ["apple", "banana", "orange"]

以上的这些方法可以将类数组对象转换为真正的数组,并可以使用数组的方法和属性对其进行操作。根据实际需求选择适合的方式进行处理。

六. 总结

通过本篇文章,我们了解了在 JavaScript 中处理类数组对象的一些优雅的技巧。这些技巧可以帮助我们更加灵活地操作和处理数据,提高开发效率和代码质量。

首先,我们学习了几种在前端开发中常见的类数组对象。包括:arguments对象、NodeList对象、HTMLCollection对象、TypedArray对象,以及FileList等。

其次,我们了解了如何将类数组对象转换为真正的数组。可以使用 Array.from() 方法、Array.prototype 方法或者扩展运算符(...)来实现转换。这些方法可以让我们方便地使用数组的方法和属性进行处理。

总结来说,处理类数组对象对于 JavaScript 开发者来说是非常重要的,在实际开发中,我们经常遇到类数组对象,只有了解这些处理技巧,我们才能更加轻松地处理数据,编写高效、干净的代码。加油!

< 15个JavaScript高级技巧,让你的代码更优雅高效 > 本文分享了15个提升JavaScript开发效率的高级技巧,涵盖对象处理、数组操作、函数优化等常见场景。文章包含原创实用的代码示例,每个技巧都附带原理说明和实际应用案例,如优雅处理对象默认值、链式数组操作、参数类型校验、增强版防抖节流函数、深度对象合并等。这些方法经过项目验证,能帮助开发者编写更简洁高效的代码,同时兼顾可读性和性能。适合不同水平的JavaScript开发者学习参考,提升日常开发中的代码质量。 阅读详情

相关推荐

优雅处理类数组对象的前端技巧

在JavaScript中,类数组对象是一种拥有类似数组结构的对象,但并不具备数组的所有方法和属性。类数组对象并不具备数组的slice方法,但我们可以借用Array.prototype.slice方法进行切片操作。由于类数组对象不具备数组的方法,我们通常需要将其转换为真正的数组,以便能够使用数组的各种方法。通过转换为真正的数组、使用forEach、slice、map和filter等方法,我们可以优雅地处理类数组对象。map方法会创建一个新数组,其中的每个元素都是原始类数组对象经过回调函数处理后的结果。

ZuqCloud的博客 170

前端如何优雅处理类数组对象?

欢迎关注我的微信公众号“前端自习课” 一、背景介绍 Leo 部门最近来了位前端实习生 Robin,作为师傅,Leo 认真的为 Robin 介绍了公司业务、部门工作等情况,还有前端的新人学习地图。 接下来 Robin 开始一周愉快的学习啦~ 一周后,Leo 为 Robin 同学布置了学习作业,开发一个【人员搜索选择】的页面,效果大致如下: Robin 看完这个效果图后,一脸得意的样子,这确实不难呀~ 过几天后,Robin 带着自己写的代码,给 Leo 展示了她的代码,并疑惑的问到: 她将这个“数组”输出到

pingan8787 1732

从亚稳态到流片失败:SpyGlass CDC在5G芯片设计中的避坑指南

本文深入探讨了在复杂5G芯片设计中,如何利用SpyGlass CDC工具构建高效的时钟域交叉验证流程,以避免因亚稳态问题导致的流片失败。文章结合实战经验,详细解析了从约束编写、时钟复位完整性检查到层次化验证和特殊场景处理的全过程,并强调了精准的检查约束是确保验证有效性的基石,旨在帮助设计团队安全跨越异步时钟域的雷区。

weixin_29168153的博客 444

前端如何优雅的处理类数组对象

常见的几种类数组对象: arguments对象 arguments 对象; function fun() { return arguments; } fun(1,2,3) // Arguments(3) [1, 2, 3, callee: ƒ, Symbol(Symbol.iterator): ƒ] NodeList(比如 document.getElementsByClassName(‘a’) 得到的结果; document.getElementsByTagName(‘img’) // H.

weixin_44268707的博客 345

用Matlab机器人工具箱搞定六轴机械臂建模:从DH参数到3D可视化(附完整代码)

本文详细介绍了如何使用Matlab机器人工具箱进行六轴机械臂建模,从DH参数输入到3D可视化全流程解析。通过正运动学验证、逆运动学求解和交互控制等实战技巧,帮助工程师快速掌握机械臂建模核心方法,并提供完整代码示例解决常见问题。

weixin_27372101的博客 394

机器学习系列(3)_逻辑回归应用之Kaggle泰坦尼克之灾

f作者: 寒小阳 &&龙心尘 时间:2015年10月。 出处: 声明:版权所有,转载请注明出处,谢谢。手把手机器学习之逻辑回归应用——Kaggle泰坦尼克之灾1.引言先说一句,年末双十一什么的一来,真是非(mang)常(cheng)欢(gou)乐(le)!然后push自己抽出时间来写这篇blog的原因也非常简单: 写完前两篇逻辑回归的介绍和各个角度理解之后,小伙伴们纷纷表示『好像很高级的样纸,

寒小阳 43万+

类数组对象终极处理

需要处理得字符串是 var str="[{att=ceshiw,arrid=2343434},{att=ceshiw,arrid=2343434}]" 需要处理成 var str=[{att:ceshiw,arrid:2343434},{att:ceshiw,arrid:2343434}] <!DOCTYPE html> <html lang="...

weixin_45176415的博客 2682

ESP-SR实战:从零搭建智能语音唤醒与命令识别系统

本文详细介绍了如何利用乐鑫ESP-SR框架,从零开始搭建一个完整的离线智能语音交互系统。内容涵盖硬件选型(推荐ESP32-S3与数字麦克风)、开发环境配置(ESP-IDF与ESP-ADF),并深入解析了AFE声学前端、WakeNet唤醒词检测和MultiNet命令词识别三大核心模块的工作原理与实战配置。通过具体的代码示例和调试技巧,指导开发者快速实现高识别率的语音唤醒与命令控制功能。

weixin_29161785的博客 302

【JS基础】前端如何优雅的处理类数组对象?

前端如何优雅的处理类数组对象? 一、背景介绍 Leo 部门最近来了位前端实习生 Robin,作为师傅,Leo 认真的为 Robin 介绍了公司业务、部门工作等情况,还有前端的新人学习地图。 接下来 Robin 开始一周愉快的学习啦~ 一周后,Leo 为 Robin 同学布置了学习作业,开发一个【人员搜索选择】的页面,效果大致如下: Robin 看完这个效果图后,一脸得意的样子,这确实不难呀~ 过几天后,Robin 带着自己写的代码,给 Leo 展示了她的代码,并疑惑的问到: 她将这个“数组”输出到控制台

Milk~每天分享一点点,技术进步一点点 467

YOLOv8安防监控实战:跌倒/闯入/徘徊实时检测(附TensorRT加速+声光报警部署代码)

精准性:针对跌倒/闯入/徘徊的行为特征优化,准确率达89.3%,误报率低于5次/天;实时性:TensorRT加速到50+FPS,报警延迟<1秒,满足安防“黄金响应时间”;低成本:无需专用AI芯片,RTX 3060或Jetson Orin就能跑,硬件成本比传统方案低60%;易部署:代码全开源,提供从模型训练到硬件联动的完整流程,2天即可搭起原型系统。如果你的安防监控还在“漏报误报”“响应慢”,建议先从跌倒检测的姿态过滤改起——用100张样本测试,再集成TensorRT加速,90%能看到明显改善。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 680

从Overleaf上导出Latex论文发布到arxiv详细教程(常见问题与解决)

如果是做cv的论文请选择“Computer Vision and Pattern Recognition”,选择“Artificial Intelligence”可能会被on hold,貌似这个指的是传统的人工智能?我用公司邮箱注册发布一篇论文,一个多月还是“on hold”状态,换成edu邮箱第二天就被发布了。3、有可能是subject class选错了,编辑会帮你手动选择,然后发一封邮件告知你解除……报错缺失bbl等文件,这是因为从Menu中下载的话,是没有bbl文件的。论文被on hold。

沉迷单车的追风少年 3586

vue.js 数组里面有对象、数组_前端如何优雅处理类数组对象?

一、背景介绍Leo 部门最近来了位前端实习生 Robin,作为师傅,Leo 认真的为 Robin 介绍了公司业务、部门工作等情况,还有前端的新人学习地图。接下来 Robin 开始一周愉快的学习啦~一周后,Leo 为 Robin 同学布置了学习作业,开发一个【人员搜索选择】的页面,效果大致如下:Robin 看完这个效果图后,一脸得意的样子,这确实不难呀~过几天后,Robin 带着自己写的代码,给 L...

weixin_39556064的博客 1435

华为OD机试真题 新系统2026-04-15 C++ 实现【失灵的键盘】

有一个键盘有2个按键失灵了,按下这些键时会连续输出其他键对应的字符两次。具体如下: 1. 按下j键一次,屏幕上显示uu(两个连续的u);  按下b键一次,屏幕上显示t(两个连续的t) 2. u键和t键是好的,按下u键一次时,屏幕只会显示一次u(正常按键);按下t键一次时,屏幕只会显示一次t(正常按键) 3. 假定屏幕上连续显示两个t一定是按了一次b键,而不是两次t键;假定按键t之后不会紧接着按键b,即tttt转义为两个b,而不可能是tb

MISAYAONE的博客 212

【JS】723- 前端如何优雅的处理类数组对象?

一、背景介绍 Leo 部门最近来了位前端实习生 Robin,作为师傅,Leo 认真的为 Robin 介绍了公司业务、部门工作等情况,还有前端的新人学习地图。接下来 Robin 开始一周愉...

奇舞周刊 279

Xilinx FPGA平台GTX简易使用教程(五)GTX收发测试及示例工程介绍

GTX IP配置完了,你不得搞个回环测试一番?

数字IC/FPGA杂货铺,找一找,或许有你想要的~ 1万+

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

java类和对象数组传参_【JS】前端如何优雅的处理类数组对象?

一、背景介绍 Leo 部门最近来了位前端实习生 Robin,作为师傅,Leo 认真的为 Robin 介绍了公司业务、部门工作等情况,还有前端的新人学习地图。接下来 Robin 开始一周愉快的学习啦~一周后,Leo 为 Robin 同学布置了学习作业,开发一个【人员搜索选择】的页面,效果大致如下:Robin 看完这个效果图后,一脸得意的样子,这确实不难呀~过几天后,Robin 带着自己写...

weixin_39636608的博客 169

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

JS 中的类数组对象如何转换为数组?

JS 中的类数组对象如何转换为数组?

高先生的猫 817

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

借用空数组方法:处理类数组的对象的实用技巧

总之,借用空数组的方法是一种方便而常见的技巧,可用于处理类似数组的对象。通过将数组的方法与这些对象绑定,我们可以使用数组的方法来处理它们,提高代码的可读性和简洁性。例如,可以使用 Array.from() 方法将类似数组的对象转换为真正的数组,然后直接使用数组的方法来操作。同样的技巧也适用于其他类似数组的对象,比如 Arguments 对象,它是一个包含函数参数的类数组对象。通过将数组的方法与类似数组的对象绑定,我们可以将这些方法应用于这些对象,就好像它们是真正的数组一样。在上面的代码中,我们首先通过。

Blog of Leviash 316

JavaScript 伪装者现形记:类数组的真面目!

JavaScript中的类数组对象(如arguments、NodeList等)表面像数组,具有length属性和索引访问,却无法直接使用数组方法(如forEach、map)。这常导致"xxx is not a function"错误。识别类数组的关键是检查其是否继承Array.prototype,可通过Array.from()或展开运算符将其转换为真数组。掌握类数组的转换技巧(如Array.from(arguments))能避免常见陷阱,提升代码效率。理解这一特性是JS开发者从困惑到精通

朱雀随云记的博客 1169

探秘Dottie.js:优雅处理JavaScript对象的深度导航工具

探秘Dottie.js:优雅处理JavaScript对象的深度导航工具 在复杂的前端开发世界里,处理嵌套的对象结构常常是一项挑战。今天,让我们一起探索一个曾经风靡一时的小巧工具——Dottie.js,它虽然目前不再活跃维护,但其设计理念和功能依旧值得我们借鉴和使用,特别是在那些对第三方库依赖较小或需要轻量级解决方案的场景中。 项目介绍 Dottie.js是一个简洁的JavaScript库,专为了解...

gitblog_00605的博客 1042

【免费下载】 探索ExcelJS:新一代JavaScript库,让你在Web上优雅地处理电子表格

是一个轻量级且强大的JavaScript库,允许开发者在浏览器端或者Node.js环境中生成、读取和修改Excel文件。无论你是需要创建动态报告、导出复杂数据,还是希望提供一种用户友好的方式来交互数据,ExcelJS都能成为你的得力助手。 ## 技术分析 ### 文件格式支持 ExcelJS 支持最新的ECMAScript标准,并且兼容多种Excel文件格式,包括老式的`.xls` 和现代的

gitblog_00059的博客 3941

Just.js对象处理10大实用技巧:提升JavaScript开发效率

Just.js是一个无依赖的JavaScript工具库,专注于提供单一功能的实用工具。在JavaScript开发中,对象处理是最常见的需求之一,Just.js提供了一系列轻量级、高效的**对象处理工具**,能显著提升开发效率。本文将分享10个实用的**对象处理技巧**,帮助您更好地利用这个强大的工具库。 ## 🔧 1. 对象深拷贝:避免引用陷阱 在JavaScript中,对象赋值默认是引用传

gitblog_01158的博客 783

优雅的书写JS代码

Airbnb 优雅之ES5 优雅之React 优雅之css-in-javascript 数组 // 复制 var len = items.length; var itemsCopy = []; var i; // bad for (i = 0; i < len; i++) { itemsCopy[i] = items[i]; } // good itemsCopy = ...

weixin_30544657的博客 138

揭秘PostCSS-JS工作原理:如何优雅处理JS对象中的CSS规则

PostCSS-JS是一款专为CSS-in-JS场景设计的工具,它能让开发者在JavaScript对象中编写CSS规则,并通过PostCSS生态系统处理这些样式。无论是React内联样式还是Free Style等CSS-in-JS方案,PostCSS-JS都能提供强大的样式处理能力,让CSS规则在JS对象中焕发新的活力。 ## 核心功能解析:PostCSS-JS如何连接JS与CSS PostC

gitblog_00188的博客 1067
上一篇: 抱歉,前端今年我劝各位真的别轻易离职
下一篇: 从 0 到 1 开发一个 node 命令行工具
Cipher_Y
博客等级 码龄3年 93粉丝 98原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值