数组的Arguments

175 阅读3分钟

在JavaScript编程中,arguments是一个内置的特殊对象,它在函数内部起着至关重要的作用。尽管它被称为“arguments”,但它并不是一个真正的数组,而是一个类数组对象。

一、arguments对象概述

arguments对象是函数的一个内置属性,它包含了传递给函数的所有参数。这些参数在arguments对象中是以索引形式存储的,类似于数组,但它实际上是一个对象。因此,它有时被称为“类数组对象”。

arguments对象具有以下几个关键特性:

  • 索引访问:可以通过索引(如arguments[0])访问传递给函数的参数。
  • length属性arguments.length表示传递给函数的参数个数。
  • 不可显式创建arguments对象不能通过代码显式创建,它只能在函数体内部访问。

二、arguments与数组的区别

虽然arguments对象看起来和数组很像,但它们之间存在一些重要的区别:

  • 类型arguments是一个对象,而不是数组。这意味着它不具有数组的方法,如pushpop等。
  • 遍历方式:虽然可以使用for循环和for...in循环遍历arguments对象,但推荐使用for循环,因为for...in循环会遍历对象的所有可枚举属性,包括原型链上的属性。
  • 严格模式下的差异:在严格模式下(使用'use strict'),arguments对象的行为会有所不同。例如,不能修改arguments对象的值来影响对应的命名参数。

三、arguments对象的用途

arguments对象在JavaScript编程中有多种用途:

  • 处理不确定数量的参数:当函数需要处理不确定数量的参数时,可以使用arguments对象来访问所有传递的参数。
  • 递归调用:在递归函数中,可以使用arguments.callee来引用当前正在执行的函数(注意:在严格模式下,arguments.callee是禁用的)。
  • 参数验证:可以使用arguments.length来验证传递给函数的参数数量是否符合预期。

打印arguments对象:

image.png

四、将arguments对象转换为数组

尽管arguments对象不是真正的数组,但可以通过一些方法将其转换为数组。这通常是为了能够使用数组的方法来处理arguments对象中的元素。

以下是几种将arguments对象转换为数组的方法:

  • 使用Array.prototype.slice.call(arguments)

    	function test() {
          var args = Array.prototype.slice.call(arguments);
          console.log(args); // [1, 2, 3]
        }
        test(1, 2, 3);
    
  • 使用ES6的扩展运算符(...

    	function test(...args) {
    	  console.log(args); // [1, 2, 3]
    	}
    	test(1, 2, 3);
    
  • 使用Array.from()方法

    	function test() {
    	  var args = Array.from(arguments);
    	  console.log(args); // [1, 2, 3]
    	}
    	test(1, 2, 3);
    

五、箭头函数中的arguments

需要注意的是,箭头函数没有自己的arguments对象。在箭头函数中访问arguments时,它实际上引用的是包含该箭头函数的外部函数的arguments对象。因此,在箭头函数中通常建议使用剩余参数(...rest)来替代arguments

function a() {
  arguments; // 指向a函数的arguments
  var add = (() => {
    console.log(arguments); // 引用a函数的arguments,而不是箭头函数自己的
  });
  add();
}
a(1, 2); // Arguments(2)[1, 2, callee: ƒ, Symbol(Symbol.iterator): ƒ]

六、其余类数组

document.getElementsByTagName()
document.getElementsByClassName()
document.querySelectorAll()