arguments 是一个相似数组的对象, 对应于传递给函数的参数。数组
arguments
app
arguments对象是全部函数中可用的局部变量。你可使用arguments对象在函数中引用函数的参数。此对象包含传递给函数的每一个参数的条目,第一个条目的索引从0开始。例如,若是一个函数传递了三个参数,你能够参考它们以下:函数
arguments[0]
arguments[1]
arguments[2]
参数也能够被设置:优化
arguments[1] = 'new value';
|
arguments
对象不是一个 Array
。它相似于数组,但除了 长度以外没有任何数组属性。例如,它没有 pop
方法。可是它能够被转换为一个真正的数组::ui
let args = Array.prototype.slice.call(arguments);
let args = [].slice.call(arguments);
|
你还可使用 Array.from()
方法或 spread
运算符将 arguments 转换为真正的数组:spa
let args = Array.from(arguments);
let args = [...arguments];
|
对参数使用slice会阻止某些JavaScript引擎中的优化 (好比 V8 引擎)。prototype
若是你关心它们,尝试经过遍历arguments对象来构造一个新的数组。rest
另外一种方法是使用 被忽视的/鄙视/轻视,/看不起 Array构造函数做为一个函数:code
let args = (
arguments.length === 1 ?
[
arguments[0]] :
Array.apply(null, arguments)
);
|
若是 Array generics 可用的话,下面的代码能够做为替代:对象
var args = Array.slice(arguments);
|
arguments 对象仅在函数内部有效,在函数外部调用 arguments 对象会出现一个错误。
arguments的typeof返回’object‘。
console.log(typeof arguments); // 'object'
可使用索引来肯定各个arguments的类型。
console.log(typeof arguments[0]);
//这将返回单个参数的typeof。
|
若是你调用一个函数,当这个函数的参数数量比它显式声明的参数数量更多的时候,你就可使用 arguments 对象。这个技术对于参数数量是一个可变量的函数来讲比较有用。 你能够用 arguments.length 来获得参数的数量,而后能够用 arguments object 来对每一个参数进行处理。 (想要获得函数签名的参数数量, 请使用 Function.length 属性。)
arguments.callee
// 指向当前执行的函数。
arguments.caller
// 指向调用当前函数的函数。
arguments.length
// 指向传递给当前函数的参数数量。
|
这个例子定义了一个函数来链接字符串。这个函数惟一正式声明了的参数是一个字符串,该参数指定一个字符做为衔接点来链接字符串。该函数定义以下:
function myConcat(separator) {
var args = Array.prototype.slice.call(arguments, 1);
return args.join(separator);
}
|
你能够传递任意数量的参数到该函数,而后该函数会将每一个参数做为一个条目来建立一个列表。
myConcat(
", ", "red", "orange", "blue");
// returns "red, orange, blue"
myConcat(
"; ", "elephant", "giraffe", "lion", "cheetah");
// returns "elephant; giraffe; lion; cheetah"
myConcat(
". ", "sage", "basil", "oregano", "pepper", "parsley");
// returns "sage. basil. oregano. pepper. parsley"
|
这个例子定义了一个函数经过一个字符串来建立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 list
return result;
}
|
你能够传递任意数量的参数到该函数,而后该函数会将每一个参数做为一个条目添加到第一个参数指定类型的列表当中。
var listHTML = list("u", "One", "Two", "Three");
/* listHTML is:
"<ul><li>One</li><li>Two</li><li>Three</li></ul>"
*/
|
ES6中的箭头函数没有本身的 arguments
对象,不过在大多数情形下,rest
参数能够给出一个解决方案:
let a;
const fn = (...rest) => Array.prototype.slice.call(rest, 1);
a = fn(
1, 2); // [2]
|