专栏首页乐赞分享JS中Arguments对象

JS中Arguments对象

描述

arguments 是一个对应于传递给函数的参数的类数组对象。

arguments对象是所有(非箭头)函数中都可用的局部变量。你可以使用arguments对象在函数中引用函数的参数。此对象包含传递给函数的每个参数,第一个参数在索引0处。例如,如果一个函数传递了三个参数,你可以以如下方式引用他们:

arguments[0]
arguments[1]
arguments[2]

当然参数也可以被设置:

arguments[1] = 'new value';

arguments对象不是一个 Array。它类似于 Array,但除了length属性和索引元素之外没有任何Array属性。例如,它没有 pop 方法。但是它可以被转换为一个真正的Array

var args = Array.prototype.slice.call(arguments);
var args = [].slice.call(arguments);

// ES2015
const args = Array.from(arguments);
const args = [...arguments];

属性

arguments.callee

指向参数所属的当前执行的函数。 指向调用当前函数的函数。(Function 对象的正文)

arguments.length

传递给函数的参数数量。

arguments[@@iterator]

返回一个新的 Array 迭代器 对象,该对象包含参数中每个索引的值。

特点

  1. arguments对象和Function是分不开的。
  2. 因为arguments这个对象不能显式创建。
  3. arguments对象只有函数开始时才可用。

拓展

length 属性

遍历参数来求和。

function add() {
    var sum =0,
        len = arguments.length;
    for(var i=0; i<len; i++){
        sum += arguments[i];
    }
    return sum;
}

add()                           // 0
add(1)                          // 1
add(1,2,3,4);                   // 10

callee 属性

实现递归函数。

function sum(n) {
    if (1 == n) {
        return 1;
    } else {
        return n + arguments.callee(n - 1); //6 5 4 3 2 1
    }
}

sum(6)          // 21

当然直接使用匿名函数也是可以的:

var sum = (function (n){
    if (1 == n) {
        return 1;
    } else {
        return n + arguments.callee(n - 1); //6 5 4 3 2 1
    }
})(6)

console.log(sum)  // 21

小知识

当使用 arguments 进行函数传递时,会有一些注意的地方,下面有一道面试题的例子:

var length = 10;
function fn() {
  console.log(this.length);
}

var obj = { 
  method: function(fn) {
    fn();
    arguments[0]();
  }
};

obj.method(fn, 1); 

那么应该输出什么呢? 答案是:

输出结果如下:
10
2

解析:

1.第一次输出的是 10 ,是因为执行了 method 中的第一个 fn() 函数,这时打印出来的 length 指的是 window 中定义的 length 。故而打印出 10 。 2.第二次输出了 2 ,这时候执行了 method 中的第二句。arguments[0]() ( arguments[0] ==> fn() ),此时的 this 指向到了arguments对象上。所以输出值为arguments的长度。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • JavaScript中数组的操作方法(含ES6)

    push() 方法可向数组的末尾添加一个或多个元素,并返回新的数组长度。会改变原数组。

    Caleb
  • Vue学习-设计模式探索

    我们假定,存在一个"信号中心",某个任务执行完成,就向信号中心"发布"(publish)一个信号,其他任务可以向信号中心"订阅"(subscribe)这个信号,...

    Caleb
  • Valine Admin修改版教程

    这里是基于Valine Admin修改版的教程文档。如还没有配置基本参数,请移步到Valine Admin后台搭建(最新修订版)

    Caleb
  • 2015.12.01 HTML5真题练习

    HTML5学堂:每天一道题,强壮程序员!今日主要涉及昨日题目的解答,以及一道涉及数组、字符串、操作符的题目 HTML5真题【2015.11.30】答案解析 昨日...

    HTML5学堂
  • js中arguments的使用

    在JavaScript中,arguments对象是比较特别的一个对象,实际上是当前函数的一个内置属性。arguments非常类似Array,但实际上又不是一个A...

    OECOM
  • 前端学习(36)~js学习(十三):this

    解析器在调用函数每次都会向函数内部传递进一个隐含的参数,这个隐含的参数就是this,this指向的是一个对象,这个对象我们称为函数执行的 上下文对象。

    Vincent-yuan
  • arguments,想说爱你不容易

    HTML5学堂-码匠:arguments是关于函数参数的一个知识点,也是很多企业面试时的“必考点”,arguments和形参有何不同?如何去检测实参或形参的长度...

    HTML5学堂
  • 完全理解 arguments

    每一个函数都有一个arguments,它包含了函数所要调用的参数,通常我们把它当作数组,通过下标获取参数。然而它却不是数组

    Karl Du
  • js的arguments分析

    执行结果中可以发现,argument和函数的参数列表中的变量是有关联的,这里假设函数的实参和形参个数是一样的。这个结果的背后到底是怎么回事,看了一下es5的ar...

    theanarkh
  • 漫画:什么是openEuler社区?

    openEuler是一个开源、免费的Linux发行版平台,将通过开放的社区形式与全球的开发者共同构建一个开放、多元和架构包容的软件生态体系。

    小灰

扫码关注云+社区

领取腾讯云代金券