美文网首页饥人谷技术博客
函数的arguments对象

函数的arguments对象

作者: 辉夜乀 | 来源:发表于2017-04-07 18:59 被阅读30次

    定义

    由于JavaScript允许函数有不定数目的参数,所以我们需要一种机制,可以在函数体内部读取所有参数。这就是arguments对象的由来。

    用法

    • 读取参数:
      arguments对象包含了函数运行时的所有参数,arguments[0]就是第一个参数,arguments[1]就是第二个参数,以此类推。这个对象只有在函数体内部,才可以使用。
    var f = function(one) {
      console.log(arguments[0]);
      console.log(arguments[1]);
      console.log(arguments[2]);
      console.log(arguments);
    }
    
    f(1, 2, 3)
    // 1
    // 2
    // 3
    // [1,2,3]
    
    • 为参数赋值
      arguments对象除了可以读取参数,还可以为参数赋值(严格模式不允许这种用法)。
    var f = function(a, b) {
      arguments[0] = 3;
      arguments[1] = 2;
      return a + b;
    }
    
    f(1, 1)
    // 5
    
    • 查询参数个数
      可以通过arguments对象的length属性,判断函数调用时到底带几个参数。
    function f() {
      return arguments.length;
    }
    
    f(1, 2, 3) // 3
    f(1) // 1
    f() // 0
    

    与数组的关系

    需要注意的是,虽然arguments很像数组,但它是一个对象。数组专有的方法(比如slice和forEach),不能在arguments对象上直接使用。

    但是,可以通过apply方法,把arguments作为参数传进去,这样就可以让arguments使用数组方法了。

    // 用于apply方法
    myfunction.apply(obj, arguments).
    
    // 使用与另一个数组合并
    Array.prototype.concat.apply([1,2,3], arguments)
    

    要让arguments对象使用数组方法,真正的解决方法是将arguments转为真正的数组。下面是两种常用的转换方法:slice方法和逐一填入新数组。

    var args = Array.prototype.slice.call(arguments);
    
    // or
    
    var args = [];
    for (var i = 0; i < arguments.length; i++) {
      args.push(arguments[i]);
    }
    

    callee属性

    arguments对象带有一个callee属性,返回它所对应的原函数。

    var f = function(one) {
      console.log(arguments.callee === f);
    }
    
    f() // true
    

    可以通过arguments.callee,达到调用函数自身的目的。这个属性在严格模式里面是禁用的,因此不建议使用。

    相关文章

      网友评论

        本文标题:函数的arguments对象

        本文链接:https://www.haomeiwen.com/subject/yqzhattx.html