arguments函数
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函数相关推荐
- Arguments(函数参数对象)的属性和使用
Arguments(函数参数对象) arguments[ ] 函数参数的数组 Arguments 一个函数的参数和其他属性 Arguments.callee 当前正在运行的函数 Arguments.l ...
- JS的arguments函数
arguments对象可以与剩余参数.默认参数和解构赋值参数结合使用. function foo(...args) {return args; } foo(1, 2, 3); // [1,2,3] 在 ...
- JavaScript函数之实际参数对象(arguments) / callee属性 / caller属性 / 递归调用 / 获取函数名称的方法...
函数的作用域:调用对象 JavaScript中函数的主体是在局部作用域中执行的,该作用域不同于全局作用域.这个新的作用域是通过将调用对象添加到作用域链的头部而创建的(没怎么理解这句话,有理解的亲可以留 ...
- JS:函数的内置对象:arguments
我们可以通过一个案列来理解什么是内置对象,arguments是什么,有什么作用,我们为什么要学 <!DOCTYPE html> <html lang="en"&g ...
- JS:函数中的arguments
一.什么是arguments 函数内部有一个特殊的对象叫arguments,里面包含了传递给函数的每个参数,适用于函数参数无法确定个数的情况下. 1.可以使用arguments.length检测函数的 ...
- JS 总结之函数、作用域链
在 JavaScript 中,函数实际上是一个对象. ? 声明 JavaScript 用 function 关键字来声明一个函数: function fn () {} 复制代码 变体:函数表达式: v ...
- javascript基础系列:函数(三)
函数 function 函数就是一个方法或者一个功能体,函数就是实现某个功能的代码放到一起分装,以后想要操作实现这个功能,只需要把函数执行即可,减少页面中的冗余代码,提高代码重复使用率(低耦合高内聚) ...
- Python基础知识(四)--函数
def functionName(arguments): #函数名(参数列表_可选) suite #函数体 def get_int(msg): whi ...
- Sass 内置函数总结
Sass 内置函数总结 作者: jcLee95 邮箱 :291148484@163.com CSDN 主页:https://blog.csdn.net/qq_28550263?spm=1001.210 ...
最新文章
- Go简单的Goroutine示例
- mongodb 入门笔记
- React Native 一些事
- android aptx固件,新增aptX蓝牙发射协议,M5固件首次升级!
- 在Silverlight 2应用程序中集成Virtual Earth
- day13 java的多态
- centos 卸载docker_linux系统Docker安装及卸载
- 学习 Qt 编程的好书推荐
- 重锤痛击 robocode!
- 蓝桥杯等差素数列(暴力)
- python实现单层单向RNN
- ssm基于web的教务管理系统毕业设计源码261620
- 为PXI硬件选择合适的设备驱动程序–VISA还是IVI?
- ffmpeg合并多mp4视频
- 前端程序员兼职副业平台推荐
- Pyton IO编程
- laravel中公共子视图继承实现
- string.h头文件
- wxPython使用EVT_MENU_OPEN事件实现运行时生成动态菜单
- 起底欧莱雅“美护”帝国:23个品牌“连轴转”,打下2119亿江山