欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JavaScript arguments对象详解

程序员文章站 2022-06-09 20:07:02
...

  arguments 是 JavaScript 函数体中的一个内置对象,虽然经常被人所忽视,但实际上非常重要。所有主流的 JavaScript 函数库都利用了 arguments 对象。

arguments 对象的属性


  对于一个对象而言,我们先来看一看arguments对象的三个属性的作用,然后分别来聊聊如何运用这三个属性

 1.callee:指向当前函数的引用
 2.length:真正传递的参数的个数
 3.properties-indexes:函数的参数值(按参数列表从左到右排列)

callee 属性

  该属性是一个指针,指向拥有这个 arguments 对象的函数
  下面是一个用到常见的利用 callee 属性定义阶乘函数。

function foo(x) {
    return x >= 1 ? x * arguments.callee(x-1) : 1
}
console.log(foo(3)) // 6

  定义阶乘函数一般都要用到递归算法,利用 callee 属性可以消除递归函数的执行与函数名 foo 的紧密耦合

注: 不过由于访问 arguments 是个很昂贵的操作,因为它是个很大的对象,每次递归调用时都需要重新创建。影响现代浏览器的性能,还会影响闭包。
所以 arguments.callee 并不赞成使用!

length 属性

  通过访问 arguments.length 可以知道有多少个参数传递给了函数

  我们都知道,在 JavaScript 中并没有函数重载的功能,但是借助 arguments.length 可以模拟函数重载
比如下面这个例子:

function foo() {
    if(arguments.length == 1) {
        alert("接收到1个参数!");
    } else if (arguments.length == 2) {
        alert("接收到2个参数!");
    }
}

根据参数的个数可以进行函数重载的模拟。

同数组下标访问实参

  ECMAScript 函数的参数与大多数其他语言中函数的参数有所不同。ECMAScript 函数不介意传递进来多少个参数,也不在乎传进来参数是什么数据类型。实际上,在函数体内可以通过 arguments 对象来访问这个参数数组,从而获取传递给函数的每一个参数。

——截自红宝书对函数参数的理解

  arguments 对象只是与数组类似(并不是 Array 的实例),因为它既可以使用方括号语法访问它的每一个元素(即第一个元素是 arguments[0],第二个元素是 arguments[1],以此类推),也可以访问它的 length 属性来确定传递进来多少个参数。

function foo() {
    for(var i = 0; i < arguments.length; i++) {
        console.log(arguments[i]);
    }
}
foo("hello,","world!","zwkkkk1");

借助 arguments.length下标数组,我们可以循环输出我们传入的参数,是不是很神奇又方便的功能?

上一篇: 原生js实现轮播图

下一篇: 原生js