【js】arguments浅析

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值