Arguments 对象
在一个函数中
形参:函数定义的参数
实参:函数调用时实际传的参数
参数的匹配时从左到右的,当
实参个数 < 形参个数,后面对应的形参赋值为undefined
实参格式 > 形参个数, 可以通过argument访问
概念
Javascrip中每个函数都会有一个Arguments对象实例arguments(类数组对象),它是函数的实参集合,可以用数组下标的方式"[]"引用arguments的元素
(function(i) {
console.log(arguments);
})(1);
arguments.length:函数实参个数
arguments.callee:函数自身
argument.Symbol: 迭代器Symbol(数据遍历https://www.jianshu.com/p/6d434c87f250)
特点
- arguments对象和Function是分不开的
- arguments这个对象不能显式创建
- arguments对象只有函数开始时才可用
使用
- 类似与数组一样的枚举,或者修改
// 在js中 不需要明确指出参数名,就能访问它们
function fn() {
console.log(arguments[0]);
console.log(arguments[1]);
arguments[2] = ‘hello’;
console.log(arguments[2]);
}
fn(1,2,3); // 1,2,'hello'
- 实现匿名的递归函数
// callee属性,返回正被执行的 Function 对象,也就是所指定的 Function 对象的正文
var sum = function (n) {
if (1 == n) {
return 1;
} else {
return n + arguments.callee(n - 1); //6+5+4+3+2+1
}
}
alert(sum(6)); // 21
- 类数组对象不能直接使用数组的方法
// 因为类数组对象还是一个对象,直接使用数组的方法会报错
function fn() {
arguments.push('0');
}
fn(1,2,3); // arguments.push is not a function
那么我们希望类数组对象能够和数组一样使用数组的方法,应该怎么做呢?我们一般是通过 Function.call 或者 Function.apply 方法来间接调用
function fn() {
Array.prototype.push.call(arguments, 'hobby');
var arrLikeStr = Array.prototype.join.call(arguments, '&')
console.log(arrLikeStr);
return arguments;
}
console.log(fn(1));
- 类数组对象转换成真正的数组
通过 Array.prototype.slice 或 Array.prototype.splice 等方法把类数组对象转换成真正的数组
function fn() {
console.log(Array.prototype.slice.call(arguments,0)); // [1] (不会改变原先类数组对象)
console.log(arguments);
}
fn(1);
function fn() {
console.log(Array.prototype.splice.call(arguments,0)); // [1] (会改变原先类数组对象)
}
fn(1);
扩展知识
一、this的指向
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()",这里this指向的window。所以输出的值为最外层定义的length。
2.第二个值为2,执行的是method里面的第二行"arguments0"(arguments0 => fn() ),这里this执行的是arguments这个对象,所以输出值为arguments的长度
二、求最大值
function max() {
var max = arguments[0];
console.log(arguments)
for (val of arguments) {
if (val >= max) {
max = val;
}
}
return max;
}
var maxValue = max('9', 1, 2, 4)
console.log(maxValue) // 9