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);

对参数使用slice会阻止某些JavaScript引擎中的优化 (比如 V8 - 更多信息)。如果你关心性能,尝试通过遍历arguments对象来构造一个新的数组。另一种方法是使用被忽视的Array构造函数作为一个函数:

var args = (arguments.length === 1 ? [arguments[0]] : Array.apply(null, arguments));

如果调用的参数多于正式声明接受的参数,则可以使用arguments对象。这种技术对于可以传递可变数量的参数的函数很有用。使用 arguments.length来确定传递给函数参数的个数,然后使用arguments对象来处理每个参数。要确定函数签名中(输入)参数的数量,请使用Function.length属性。

对参数使用 typeof

typeof参数返回 'object'。

console.log(typeof arguments);    // 'object'
// arguments 对象只能在函数内使用
function test(a){console.log(a,Object.prototype.toString.call(arguments));console.log(arguments[0],arguments[1]);console.log(typeof arguments[0]);
}
test(1);
/*
1 "[object Arguments]"
1 undefined
number
*/

可以使用索引确定单个参数的类型。

console.log(typeof arguments[0]); //this will return the typeof individual arguments.

对参数使用扩展语法

您还可以使用Array.from()方法或扩展运算符将参数转换为真实数组:

var args = Array.from(arguments);
var args = [...arguments];

属性

arguments.callee
指向当前执行的函数。
arguments.caller 
指向调用当前函数的函数。
arguments.length
指向传递给当前函数的参数数量。
arguments[@@iterator]
返回一个新的Array迭代器对象,该对象包含参数中每个索引的值。
注意:现在在严格模式下,arguments对象已与过往不同。arguments[@@iterator]不再与函数的实际形参之间共享,同时caller属性也被移除。

例子

遍历参数求和

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

定义连接字符串的函数

这个例子定义了一个函数来连接字符串。这个函数唯一正式声明了的参数是一个字符串,该参数指定一个字符作为衔接点来连接字符串。该函数定义如下:

function myConcat(separator) {var args = Array.prototype.slice.call(arguments, 1);return args.join(separator);
}

你可以传递任意数量的参数到该函数,并使用每个参数作为列表中的项创建列表。

// returns "red, orange, blue"
myConcat(", ", "red", "orange", "blue");// returns "elephant; giraffe; lion; cheetah"
myConcat("; ", "elephant", "giraffe", "lion", "cheetah");// returns "sage. basil. oregano. pepper. parsley"
myConcat(". ", "sage", "basil", "oregano", "pepper", "parsley");

定义创建HTML列表的方法

这个例子定义了一个函数通过一个字符串来创建HTML列表。这个函数唯一正式声明了的参数是一个字符。当该参数为 "u" 时,创建一个无序列表 (项目列表);当该参数为 "o" 时,则创建一个有序列表 (编号列表)。该函数定义如下:

function list(type) {var result = "<" + type + "l><li>";var args = Array.prototype.slice.call(arguments, 1);result += args.join("</li><li>");result += "</li></" + type + "l>"; // end listreturn result;
}

你可以传递任意数量的参数到该函数,并将每个参数作为一个项添加到指定类型的列表中。例如:

var listHTML = list("u", "One", "Two", "Three");/* listHTML is:"<ul><li>One</li><li>Two</li><li>Three</li></ul>"*/

剩余参数、默认参数和解构赋值参数

arguments对象可以与剩余参数、默认参数和解构赋值参数结合使用。

function foo(...args) {return args;
}
foo(1, 2, 3);  // [1,2,3]

在严格模式下,剩余参数、默认参数和解构赋值参数的存在不会改变 arguments对象的行为,但是在非严格模式下就有所不同了。

当非严格模式中的函数没有包含剩余参数、默认参数和解构赋值,那么arguments对象中的值会跟踪参数的值(反之亦然)。看下面的代码:

function func(a) { arguments[0] = 99;   // 更新了arguments[0] 同样更新了aconsole.log(a);
}
func(10); // 99

并且

function func(a) { a = 99;              // 更新了a 同样更新了arguments[0] console.log(arguments[0]);
}
func(10); // 99

当非严格模式中的函数有包含剩余参数、默认参数和解构赋值,那么arguments对象中的值不会跟踪参数的值(反之亦然)。相反, arguments反映了调用时提供的参数:

function func(a = 55) { arguments[0] = 99; // updating arguments[0] does not also update aconsole.log(a);
}
func(10); // 10

并且

function func(a = 55) { a = 99; // updating a does not also update arguments[0]console.log(arguments[0]);
}
func(10); // 10

并且

function func(a = 55) { console.log(arguments[0]);
}
func(); // undefined

arguments函数相关推荐

  1. Arguments(函数参数对象)的属性和使用

    Arguments(函数参数对象) arguments[ ] 函数参数的数组 Arguments 一个函数的参数和其他属性 Arguments.callee 当前正在运行的函数 Arguments.l ...

  2. JS的arguments函数

    arguments对象可以与剩余参数.默认参数和解构赋值参数结合使用. function foo(...args) {return args; } foo(1, 2, 3); // [1,2,3] 在 ...

  3. JavaScript函数之实际参数对象(arguments) / callee属性 / caller属性 / 递归调用 / 获取函数名称的方法...

    函数的作用域:调用对象 JavaScript中函数的主体是在局部作用域中执行的,该作用域不同于全局作用域.这个新的作用域是通过将调用对象添加到作用域链的头部而创建的(没怎么理解这句话,有理解的亲可以留 ...

  4. JS:函数的内置对象:arguments

    我们可以通过一个案列来理解什么是内置对象,arguments是什么,有什么作用,我们为什么要学 <!DOCTYPE html> <html lang="en"&g ...

  5. JS:函数中的arguments

    一.什么是arguments 函数内部有一个特殊的对象叫arguments,里面包含了传递给函数的每个参数,适用于函数参数无法确定个数的情况下. 1.可以使用arguments.length检测函数的 ...

  6. JS 总结之函数、作用域链

    在 JavaScript 中,函数实际上是一个对象. ? 声明 JavaScript 用 function 关键字来声明一个函数: function fn () {} 复制代码 变体:函数表达式: v ...

  7. javascript基础系列:函数(三)

    函数 function 函数就是一个方法或者一个功能体,函数就是实现某个功能的代码放到一起分装,以后想要操作实现这个功能,只需要把函数执行即可,减少页面中的冗余代码,提高代码重复使用率(低耦合高内聚) ...

  8. Python基础知识(四)--函数

    def functionName(arguments):    #函数名(参数列表_可选) suite                       #函数体 def get_int(msg): whi ...

  9. Sass 内置函数总结

    Sass 内置函数总结 作者: jcLee95 邮箱 :291148484@163.com CSDN 主页:https://blog.csdn.net/qq_28550263?spm=1001.210 ...

最新文章

  1. Go简单的Goroutine示例
  2. mongodb 入门笔记
  3. React Native 一些事
  4. android aptx固件,新增aptX蓝牙发射协议,M5固件首次升级!
  5. 在Silverlight 2应用程序中集成Virtual Earth
  6. day13 java的多态
  7. centos 卸载docker_linux系统Docker安装及卸载
  8. 学习 Qt 编程的好书推荐
  9. 重锤痛击 robocode!
  10. 蓝桥杯等差素数列(暴力)
  11. python实现单层单向RNN
  12. ssm基于web的教务管理系统毕业设计源码261620
  13. 为PXI硬件选择合适的设备驱动程序–VISA还是IVI?
  14. ffmpeg合并多mp4视频
  15. 前端程序员兼职副业平台推荐
  16. Pyton IO编程
  17. laravel中公共子视图继承实现
  18. string.h头文件
  19. wxPython使用EVT_MENU_OPEN事件实现运行时生成动态菜单
  20. 起底欧莱雅“美护”帝国:23个品牌“连轴转”,打下2119亿江山

热门文章

  1. IT和OT融合缩小物联网感知差距
  2. flink tableapi从DataStream创建表
  3. 如何快速学习CADD计算机辅助药物设计
  4. Access 2003高手攻略(奋斗的小鸟)_PDF 电子书
  5. 店招新品之创意LED显示屏之LED魔方屏的特点
  6. 树莓派4B-串口、多串口配置及详细使用攻略
  7. RS232串口电路设计
  8. 2011中国编程者=走出程序员的悲哀=谁说中国程序员只能吃青春饭?
  9. 水和计算机房怎么用英语写,和“水”相关的英文表达,你能说出几个?
  10. 一个简单的英文分词程序