首页 > 编程语言 >JavaScript 中 arguments 对象与剩余参数的对比及转换

JavaScript 中 arguments 对象与剩余参数的对比及转换

时间:2024-08-04 11:28:21浏览次数:14  
标签:剩余 slice JavaScript convertArgumentsToArray 参数 arguments 数组 Array

引言

在JavaScript中,处理函数调用时传递的不同数量的参数是一项常见的任务。为此,JavaScript 提供了两种不同的方法:arguments 对象和剩余参数(Rest Parameters)。本文将探讨这两种方法的区别,并介绍如何将 arguments 对象转换为真正的数组。

arguments 对象 vs. 剩余参数

arguments 对象

arguments 是一个类数组对象,它自动包含在每个函数作用域中,并包含了函数调用时传递的所有参数。arguments 对象具有 length 属性,表示传递给函数的实际参数的数量,并且可以通过索引来访问每个参数。

优点

  • 自动包含:
    • 每个函数都自动拥有 arguments 对象。
  • 灵活性:
    • 可以处理任意数量的参数。
  • 可变性:
    • 参数可以被修改。

缺点

  • 类数组对象:
    • arguments 不是真正的数组,因此不支持数组方法(如 .map(), .filter(), .reduce() 等)。
  • 不支持现代语法:
    • 与现代 JavaScript 语法(如箭头函数和解构赋值)不兼容。

剩余参数 (Rest Parameters)

剩余参数是一种特殊的语法,允许函数收集任意数量的参数,并将它们作为一个数组来处理。剩余参数必须是函数参数列表中的最后一个参数,并且使用三个点(...)来表示。

优点

  • 真正的数组:
    • 收集的参数是一个真正的数组,支持数组的所有方法。
  • 现代语法:
    • 与现代 JavaScript 语法兼容。
  • 清晰性:
    • 代码更加清晰易读。

缺点

  • 显式声明:
    • 需要在函数参数列表中显式声明。

arguments 对象转换为数组

由于 arguments 是一个类数组对象,它不支持数组的所有方法。为了能够使用数组的方法,我们可以将 arguments 转换成真正的数组。以下是几种常见的转换方法:

1. 使用 Array.from()

Array.from() 方法可以从类数组对象创建一个新的数组实例。

  javascript 代码解读 复制代码
function convertArgumentsToArray() {
  return Array.from(arguments);
}

console.log(convertArgumentsToArray(1, 2, 3)); // 输出: [1, 2, 3]

2. 使用扩展运算符 ...

扩展运算符可以将类数组对象展开为真正的数组。

  javascript 代码解读 复制代码
function convertArgumentsToArray() {
  return [...arguments];
}

console.log(convertArgumentsToArray(1, 2, 3)); // 输出: [1, 2, 3]

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

Array.prototype.slice.call() 方法可以将类数组对象转换为真正的数组。

  javascript 代码解读 复制代码
function convertArgumentsToArray() {
  return Array.prototype.slice.call(arguments);
}

console.log(convertArgumentsToArray(1, 2, 3)); // 输出: [1, 2, 3]

4. 使用 Array.prototype.slice.apply()

Array.prototype.slice.apply() 方法与 .call() 类似,但使用 .apply() 可以提供更多的灵活性。

  javascript 代码解读 复制代码
function convertArgumentsToArray() {
  return Array.prototype.slice.apply(arguments);
}

console.log(convertArgumentsToArray(1, 2, 3)); // 输出: [1, 2, 3]

5. 使用 Array.of()

Array.of() 方法也可以将单个值或多个值转换为数组。

  javascript 代码解读 复制代码
function convertArgumentsToArray() {
  return Array.of(...arguments);
}

console.log(convertArgumentsToArray(1, 2, 3)); // 输出: [1, 2, 3]

6. 使用 [].slice.call()

如果不想每次都调用 Array.prototype.slice.call(),可以使用 [] 代替 Array.prototype

  javascript 代码解读 复制代码
function convertArgumentsToArray() {
  return [].slice.call(arguments);
}

console.log(convertArgumentsToArray(1, 2, 3)); // 输出: [1, 2, 3]

总结

arguments 对象和剩余参数都是处理函数调用时传递的不同数量参数的有效方法。arguments 对象是类数组对象,而剩余参数是真正的数组。为了能够使用数组的方法,我们可以使用多种方法将 arguments 转换成真正的数组。

==

 

出处:https://juejin.cn/post/7398748051877806120

标签:剩余,slice,JavaScript,convertArgumentsToArray,参数,arguments,数组,Array
From: https://www.cnblogs.com/mq0036/p/18341573

相关文章

  • 【前端】JavaScript入门及实战131-135
    文章目录131定时器(1)132定时器(2)133定时器(3)134轮播图135tools.js131定时器(1)<!DOCTYPEhtml><html><head><title></title><metacharset="utf-8"><styletype="text/css"> *{ margin:0; padding:0......
  • 【前端】JavaScript入门及实战136-140
    文章目录136类的操作137二级菜单138JSON139JSON140json2.js136类的操作<!DOCTYPEhtml><html><head><title></title><metacharset="utf-8"><styletype="text/css"> .b1{ width:100px; height:100p......
  • JavaScript (十七)——JavaScript 声明提升和严格模式
    目录JavaScript声明提升JavaScript初始化不会提升在头部声明你的变量JavaScript严格模式(usestrict)使用"usestrict"指令严格模式声明严格模式的限制JavaScript声明提升JavaScript中,函数及变量的声明都将被提升到函数的最顶部。JavaScript中,变量可以在......
  • JavaScript(十八)——JavaScript 使用误区
    目录赋值运算符应用错误比较运算符常见错误加法与连接注意事项浮点型数据使用注意事项JavaScript字符串分行错误的使用分号语句使用注意事项return使用注意事项数组中使用名字来索引定义数组元素,最后不能添加逗号定义对象,最后不能添加逗号Undefined不是Null程......
  • JavaScript 中的闭包和事件委托
    闭包(Closures)闭包是JavaScript中一个非常强大的特性,它允许函数访问其外部作用域中的变量,即使在该函数被调用时,外部作用域已经执行完毕。闭包可以帮助我们实现数据的私有化、封装和模块化,使代码更简洁、易读和可维护。闭包的定义简单来说,闭包是指有权访问另一个函数作用域......
  • JavaScript实现tab栏切换 jquery实现tab栏切换 的方法的对比
    这个例子比较简单,但却很实用,当然实际工作中我们一般不会这样去写,我们通常会把以此为基础去封装一个可重用的控件,但基本思想不变。JavaScript实现tab栏切换在JavaScript中实现Tab切换的基本逻辑是通过监听每个Tab的点击事件,然后隐藏所有的内容区域,并显示对应于点击的Tab的......
  • javascript学习 - DOM 元素获取、属性修改
    什么是WebAPIWebAPI是指网页服务器或者网页浏览器的应用程序接口。简单来讲,就是我们在编写JavaScript代码时,可以通过WebAPI来操作HTML网页和浏览器。WebAPI又可以分为两类:DOM(文档对象模型)BOM(浏览器对象模型)DOM(DocumentObjectModel),即文档对象模型,主要用......
  • javascript学习 - DOM 事件
    事件什么是事件在之前DOM的学习中,我们主要学习了如何获取DOM元素,并且学会了如何给获取的元素进行属性修改等操作。但这些基本都是静态的修改,并没有接触到一些动作。而今天要学习的事件,其实就是这些动作的总称。所谓事件,就是在编程时系统内所发生的动作或者发生的事情......
  • JavaScript 中的闭包和事件委托
    包(Closures)闭包是JavaScript中一个非常强大的特性,它允许函数访问其外部作用域中的变量,即使在该函数被调用时,外部作用域已经执行完毕。闭包可以帮助我们实现数据的私有化、封装和模块化,使代码更简洁、易读和可维护。闭包的定义简单来说,闭包是指有权访问另一个函数作用域中......
  • JavaScript (八)——JavaScript 作用域和事件
    目录JavaScript 作用域JavaScript局部作用域JavaScript全局变量JavaScript变量生命周期HTML中的全局变量JavaScript 事件HTML事件常见的HTML事件JavaScript可以做什么?JavaScript 作用域作用域是可访问变量的集合。在JavaScript中,作用域为可访问变......