JavaScript 中 arguments、类数组与数组的深入解析

news2024/11/23 17:22:26

在这里插入图片描述

博客主页: [小ᶻZ࿆]
本文专栏: 前端

文章目录

  • 💯前言
  • 💯什么是 `arguments` 对象
    • 2.1 `arguments` 的定义
    • 2.2 `arguments` 的特性
    • 2.3 使用场景
  • 💯深入了解 `arguments` 的结构
    • 3.1 `arguments` 的内部结构
      • `arguments` 的关键属性
    • 3.2 类数组 VS 真正的数组
      • 什么是类数组?
      • 类数组和数组的主要区别
  • 💯如何将类数组转换为数组?
    • 4.1 使用 `Array.from`
    • 4.2 使用扩展运算符(`...`)
    • 4.3 使用 `Array.prototype.slice`
  • 💯箭头函数与 `arguments`
  • 💯现代 JavaScript 中的替代方案:剩余参数
    • 6.1 剩余参数语法
    • 6.2 优势
  • 💯总结与最佳实践
    • 7.1 使用场景建议
    • 7.2 转换类数组的首选方法
    • 7.3 常见误区
  • 💯小结


在这里插入图片描述


💯前言

  • JavaScript 是一种灵活多变的编程语言,其中有一个特别的对象叫作 arguments,在非箭头函数中非常有用。它是一个类数组对象,用于捕获调用时的所有参数。本文将从实际使用的角度,详细分析 arguments 对象、类数组和数组的区别,并通过示例讲解如何在应用中高效地使用这些特性。理解 arguments 对象和类数组的概念对 JavaScript 开发者来说至关重要,因为这可以帮助更灵活地处理函数传参问题,从而编写出更加健壮简洁的代码。
    JavaScript
    在这里插入图片描述

💯什么是 arguments 对象

在这里插入图片描述

arguments 是一个特殊的对象,在非箭头函数的作用域中自动生成。它是 JavaScript 用来捕获调用函数时传递的所有参数的一个机制。


2.1 arguments 的定义

  • arguments 是一个类数组对象,包含了调用函数时传递给函数的所有参数的值。它在函数调用时自动生成,无需手动声明。通过 arguments,我们可以访问到函数传递的所有参数,即使这些参数没有在函数的形参列表中明确定义。这种特性在处理未知数量参数时非常有用,尤其是在 JavaScript 的早期版本中,arguments 是唯一的办法来处理可变数量的参数。
    在这里插入图片描述

示例:

function example() {
  console.log(arguments); // 输出 arguments 对象
}

example(1, 2, 3);
// 控制台输出:
// [Arguments] { '0': 1, '1': 2, '2': 3 }

2.2 arguments 的特性

在这里插入图片描述

  • 类数组arguments 具有 length 属性,用于表示参数的数量,可以通过索引访问每个参数值。虽然它看起来像一个数组,但实际上它是一个对象。
  • 只读属性:在大多数环境中,arguments 的值是只读的,不能随意修改,否则可能会导致不可预期的行为。
  • 不是真正的数组:它虽然看起来像数组,但并不是真正的数组,无法直接使用数组的方法(例如 pushmap 等)。如果需要使用这些方法,我们通常需要将 arguments 转换为真正的数组。
  • 存在于普通函数中arguments 仅在普通函数中有效,在箭头函数中不存在。这是因为箭头函数没有自己的 arguments 对象,它们会从包含它们的父级作用域中继承 arguments
  • 性能警告:在现代 JavaScript 中,arguments 对象已经逐渐被剩余参数语法(...rest)取代,因为后者更加高效和直观。尤其是在涉及到复杂操作和高性能需求的情况下,剩余参数的表现通常要优于 arguments

2.3 使用场景

在这里插入图片描述

arguments 在以下情况下非常有用:

  1. 处理未知数量的参数
    在不知道函数调用时会传入多少个参数的情况下,arguments 提供了一种方法来动态访问所有参数。这在构建通用工具函数或处理多个输入值时非常有帮助。
    在这里插入图片描述

    示例:

    function sum() {
      let total = 0;
      for (let i = 0; i < arguments.length; i++) {
        total += arguments[i];
      }
      return total;
    }
    
    console.log(sum(1, 2, 3, 4)); // 输出 10
    
  2. 实现灵活的参数接口
    在没有使用 ES6 剩余参数语法的旧代码中,arguments 是处理灵活参数的主要工具。这些代码通常需要处理不固定数量的参数,并且不方便直接修改函数定义,此时 arguments 显得尤为重要。

  3. 函数重载实现
    在一些场景下,可能会需要根据传入参数的不同类型或数量来执行不同的逻辑。虽然 JavaScript 没有原生的函数重载,但可以通过 arguments 对象来模拟这种效果。
    在这里插入图片描述

    示例:

    function example() {
      if (arguments.length === 0) {
        console.log('没有传入参数');
      } else {
        console.log('传入了', arguments.length, '个参数');
      }
    }
    
    example(); // 输出: 没有传入参数
    example(1, 2); // 输出: 传入了 2 个参数
    

💯深入了解 arguments 的结构

在这里插入图片描述


3.1 arguments 的内部结构

  • 在控制台中打印 arguments 对象,会发现它是一个带有特殊属性的对象:
    在这里插入图片描述
function test() {
  console.log(arguments);
}

test(1, 2, 3);
// 输出:
/*
Arguments(3) [1, 2, 3, callee: ƒ, Symbol(Symbol.iterator): ƒ]
*/

arguments 的关键属性

在这里插入图片描述

  • 索引属性
    • 存储每个参数值,可以通过 arguments[0] 访问第一个参数,arguments[1] 访问第二个参数,以此类推。
  • length 属性
    • 表示传入的参数数量,方便我们对参数进行遍历。
  • callee 属性
    • 指向当前函数本身(严格模式下禁用),在某些场景下可能会用来递归调用。
  • Symbol.iterator 属性
    • 允许使用 for...of 循环进行遍历 arguments 对象。这使得 arguments 可以像数组一样被迭代,尽管它不是真正的数组。

3.2 类数组 VS 真正的数组

在这里插入图片描述


什么是类数组?

在这里插入图片描述

类数组是一个具有类似数组结构的对象,它满足以下条件:

  • 拥有按索引存储的数据。
  • 拥有 length 属性。
  • 不能直接使用数组的原型方法(例如 pushmap 等)。

类数组对象是广泛存在于 JavaScript 中的数据结构,常见的类数组对象包括:

常见的类数组对象:

  1. arguments 对象:捕获函数调用时传入的所有参数。
  2. NodeList(Document Object Model 操作中的节点列表,用于包含由选择器或其他查询方法返回的元素集合)。
  3. HTMLCollection(通过 getElementsByClassName 返回的集合)。

类数组和数组的主要区别

在这里插入图片描述

特性类数组数组
类型ObjectArray
检测方式typeof 返回 objectArray.isArray() 返回 true
原型方法无法直接使用数组方法可以使用数组方法
转换为数组的方式需要手动转换无需转换
遍历方式可通过索引访问支持所有数组遍历方法

类数组对象通常需要经过转换才能使用数组的方法。尽管它们在某些情况下具有数组的特性,但直接调用如 map()forEach() 这样的数组方法会导致错误,因为它们并不继承自 Array 的原型链。


💯如何将类数组转换为数组?

在这里插入图片描述

在实际开发中,类数组常常需要转换为真正的数组以使用数组的强大功能。以下是常用的转换方法:


4.1 使用 Array.from

在这里插入图片描述

  • Array.from 是一个将类数组或可迭代对象转换为数组的内置方法。
    在这里插入图片描述
function test() {
  const args = Array.from(arguments);
  console.log(args.map(x => x * 2)); // [2, 4, 6]
}

test(1, 2, 3);

4.2 使用扩展运算符(...

  • 扩展运算符是 ES6 引入的功能,可以快速地将类数组展开为数组。
    在这里插入图片描述
function test() {
  const args = [...arguments];
  console.log(args.map(x => x * 2)); // [2, 4, 6]
}

test(1, 2, 3);

4.3 使用 Array.prototype.slice

  • 在 ES5 中,slice 方法常用于将类数组转换为数组。
    在这里插入图片描述
function test() {
  const args = Array.prototype.slice.call(arguments);
  console.log(args.map(x => x * 2)); // [2, 4, 6]
}

test(1, 2, 3);

这些方法的核心目的是将类数组对象转换为一个真正的数组,以便我们能够使用数组的各种方法(如 mapfilter 等),从而更方便地进行数据操作。


💯箭头函数与 arguments

  • 在箭头函数中,arguments 对象不存在。如果需要捕获参数,必须使用剩余参数。
    在这里插入图片描述
const example = (...args) => {
  console.log(args); // [1, 2, 3]
};

example(1, 2, 3);

箭头函数没有自己的 arguments 对象,因为它们的作用域继承自包含它们的上下文。这种特性使得箭头函数更适合在保持作用域一致的回调函数中使用。


💯现代 JavaScript 中的替代方案:剩余参数

在这里插入图片描述


6.1 剩余参数语法

  • 剩余参数允许将不确定数量的参数捕获为数组。
    在这里插入图片描述
function sum(...args) {
  return args.reduce((total, current) => total + current, 0);
}

console.log(sum(1, 2, 3, 4)); // 输出 10

剩余参数的引入大大简化了函数参数的处理,因为它能够将所有的传入参数收集到一个数组中,避免了手动转换类数组的繁琐操作。


6.2 优势

在这里插入图片描述

  1. 返回真正的数组
    • 不需要额外的转换操作。
  2. 简洁明亮
    • 代码更加直观和易读。
  3. 更好的可维护性
    • 剩余参数的代码结构更简洁、逻辑更清晰,便于团队协作和代码审查。

💯总结与最佳实践

在这里插入图片描述


7.1 使用场景建议

在这里插入图片描述

  • 如果需要兼容旧版 JavaScript,且需要访问所有参数,仍可以使用 arguments
  • 在现代开发中,优先使用剩余参数替代 arguments,以简化代码逻辑。剩余参数的灵活性使其能够适应更多的场景,尤其是在函数需要处理可变数量参数时表现更优。

7.2 转换类数组的首选方法

在这里插入图片描述

  • 使用 Array.from 或扩展运算符(...)来将类数组对象转换为数组。这些方法能够更高效、更直观地完成转换,并且代码的可读性更好。

7.3 常见误区

在这里插入图片描述

  1. 误以为 arguments 是数组

    • 需要明确 arguments 是类数组,而非真正的数组。
    • 若直接调用数组方法会导致报错。例如,尝试对 arguments 调用 map() 方法会导致 TypeError
  2. 在箭头函数中使用 arguments

    • 箭头函数不支持 arguments,需要通过剩余参数捕获参数。因为箭头函数的 this 和作用域继承自父级上下文,它们不生成自己的 arguments 对象。

💯小结

  • 在这里插入图片描述
    通过这篇文章,我们深入探讨了 JavaScript 中 arguments 对象的定义特性、应用场景,以及类数组与数组的区别,并结合现代语法如剩余参数对其进行了优化替代的说明。理解这些内容将帮助我们在日常开发中更高效地处理函数参数问题,同时编写出更简洁易于维护的代码。随着 JavaScript 生态系统的不断演进,掌握这些特性不仅能提升开发效率,还能让我们编写出更具现代化风格、更符合最佳实践代码

在这里插入图片描述


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

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

相关文章

Kafka 工作流程解析:从 Broker 工作原理、节点的服役、退役、副本的生成到数据存储与读写优化

Kafka&#xff1a;分布式消息系统的核心原理与安装部署-CSDN博客 自定义 Kafka 脚本 kf-use.sh 的解析与功能与应用示例-CSDN博客 Kafka 生产者全面解析&#xff1a;从基础原理到高级实践-CSDN博客 Kafka 生产者优化与数据处理经验-CSDN博客 Kafka 工作流程解析&#xff1a…

数位之和c++

题目描述 小杨有 n个正整数&#xff0c;他认为一个正整数是美丽数字当且仅当该正整数每一位数字的总和是 7 的倍数。 小杨想请你编写一个程序判断 n 个正整数哪些是美丽数字。 输入 第一行包含一个正整数 n&#xff0c;代表正整数个数。 之后n 行&#xff0c;每行包含一个…

同三维T4000S系列高清SDI字符叠加器

同三维T4000S系列高清SDI字符叠加器 两个型号&#xff1a; 同三维T4000S-2U (2U机箱&#xff0c;可插1-16张叠加模块) 同三维T4000S1 &#xff08;单路&#xff09; 产品简介 “HD-SDI字符叠加器”可在HD-SDI视频图象信号上叠加日期、时间及中英文字符信息。广泛用于安防监…

重生之我在学环境变量

环境变量 基本概念 环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数如&#xff1a;我们在编写C/C代码的时候&#xff0c;在链接的时候&#xff0c;从来不知道我们的所链接的动态静态库在哪里&#xff0c;但 是照样可以链接成功&#…

Flink学习连载文章4-flink中的各种转换操作

首先&#xff0c;先搞一个模板代码&#xff0c;方便后面的操作 #if (${PACKAGE_NAME} && ${PACKAGE_NAME} ! "")package ${PACKAGE_NAME};#end #parse("File Header.java") import org.apache.flink.streaming.api.environment.StreamExecutionEnv…

fastadmin实现站内通知功能

实现效果如下 application/admin/view/common/header.html <style>#notificationMenu {display: none;position: absolute;top: 40px;right: 0;background: #fff;border-radius: 6px;padding: 10px 0;width: 300px;box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);z-inde…

默语博主的推荐:探索技术世界的旅程

这是第一位推荐的博主默语 引言&#xff1a; CSDN中的默语博主是一个值得关注和学习的技术大拿。他的博客内容不仅涵盖了各种热门的技术领域&#xff0c;还能够帮助读者深入了解技术背后的原理和应用。在这篇类博客的内容中&#xff0c;我们将探索默语博主推荐的几篇博客&#…

【漏洞复现】|智互联SRM智联云采系统quickReceiptDetail SQL注入漏洞

漏洞描述 智互联(深圳)科技有限公司SRM智联云采系统针对企业供应链管理难题&#xff0c;及智能化转型升级需求&#xff0c;智联云采依托人工智能、物联网、大数据、云等技术&#xff0c;通过软硬件系统化方案&#xff0c;帮助企业实现供应商关系管理和采购线上化、移动化、智能…

【数据分析】认清、明确

1、什么是数据分析。 - 通过对大量的数据进行科学的分析。 - 得出结论&#xff0c;提出建议&#xff0c;辅助公司企业的决策。2、数据分析分为几步。 - 1.明确目的! - 2.收集数据!自己的数据! 自动化采集的数据! - 3.数据处理! - 4.数据分析!数据分析(业务)数据挖掘(代码算法…

前后端分离,解决vue+axios跨域和proxyTable不生效等问题

看到我这篇文章前可能你以前看过很多类似的文章。至少我是这样的&#xff0c;因为一直没有很好的解决问题。 正文 当我们通过webstorm等IDE开发工具启动项目的时候&#xff0c;通过命令控制台可以观察到启动项目的命令 如下&#xff1a; webpack-dev-server --inline --prog…

WPF中如何让Textbox显示为一条直线

由于Textbox直接使用是一条直线 设置如下代码 可以让Textbox变为直线输入 <Style TargetType"TextBox"x:Key"UsernameTextBoxStyle"><Setter Property"Template"><Setter.Value><ControlTemplate TargetType"{x:Typ…

TSmaster Measurement setup(测量设置)

文章目录 1、Measurement setup功能介绍2、数据流过滤3、Measurement Filter 测量过滤器3.1 插入过滤器3.2 设置过滤数据3.3 过滤条件的失能3.4 窗口缩放 1、Measurement setup功能介绍 Measurement setup 窗体主要包含三个功能&#xff1a; 提供一个面板&#xff0c;用户能够…

[Unity Demo]从零开始制作空洞骑士Hollow Knight第二十集:制作专门渲染HUD的相机HUD Camera和画布HUD Canvas

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、制作HUD Camera以及让两个相机同时渲染屏幕二、制作HUD Canvas 1.制作法力条Soul Orb引入库2.制作生命条Health读入数据3.制作吉欧统计数Geo Counter4.制作…

万字长文解析Golang高性能内存缓存库BigCache

项目地址 BigCache 是一个快速&#xff0c;支持并发访问&#xff0c;自淘汰的内存型缓存&#xff0c;可以在存储大量元素时依然保持高性能。BigCache将元素保存在堆上却避免了GC的开销。 背景介绍 BigCache的作者在项目里遇到了如下的需求&#xff1a; 支持http协议支持 10…

vulfocus在线靶场:骑士cms_cve_2020_35339:latest 速通手册

目录 一、启动环境&#xff0c;访问页面&#xff0c;ip:端口号/index.php?madmin,进入后台管理页面&#xff0c;账号密码都是adminadmin 二、进入之后&#xff0c;根据图片所示&#xff0c;地址后追加一下代码&#xff0c;保存修改 ​三、新开标签页访问&#xff1a;①ip:端…

【数据结构】归并排序 —— 递归及非递归解决归并排序

归并排序 一、归并排序1、归并排序的思想2、归并排序代码实现&#xff08;递归&#xff09;<1> 归并排序的递归区间<2> 归并排序的稳定性<3> 拷贝 3、归并排序代码实现&#xff08;非递归&#xff09;<1> 循环区间溢出问题 二、总结 一、归并排序 1、…

Java技术复习提升 10异常

10 异常 10.1异常介绍及分类 异常捕获 选中后alttabt->选中try-catch 异常就是程序执行中不正常的情况 注意语法和逻辑错误并不是异常 异常分类有两种 error和exception error是错误 虚拟机无法解决的严重问题 exception是其他因为编程错误或者外在因素导致的一般性的问…

transformer.js(三):底层架构及性能优化指南

Transformer.js 是一个轻量级、功能强大的 JavaScript 库&#xff0c;专注于在浏览器中运行 Transformer 模型&#xff0c;为前端开发者提供了高效实现自然语言处理&#xff08;NLP&#xff09;任务的能力。本文将详细解析 Transformer.js 的底层架构&#xff0c;并提供实用的性…

HCIA笔记3--TCP-UDP-交换机工作原理

1. tcp协议 可靠的连接 1.1 报文格式 1.2 三次握手 1.3 四次挥手 为什么TIME_WAIT需要2MSL的等待时间&#xff1f; &#xff08;a&#xff09; 为了实现可靠的关闭 &#xff08;b&#xff09;为了让过期的报文在网络上消失 对于(a), 假设host发给server的last ack丢了。 ser…

[Redis#2] 定义 | 使用场景 | 安装教程 | 快!

目录 1. 定义 In-memory data structures 在内存中存储数据 2. 优点&#xff01;快 Programmability 可编程性 Extensibility 扩展性 Persistence 持久化 Clustering 分布式集群 High availability 高可用性 ⭕快速访问的实现 3. 使用场景 1.Real-time data store …