JS Arguments的使用

JS Arguments的主要特点

  • 当参数的个数不确定时,可以用arguments来获取。arguments对象中存储了传递的所有实参。
  • arguments对象是所有(非箭头)函数中都可用的局部变量。
  • arguments对象是一个伪数组. 除了length和索引外,不能用任何数组的方法。
  • 可以使用arguments对象在函数中引用函数的参数,索引从0开始。
function func(){
	console.log(arguments)//Arguments(3) [1, 2, 3, callee: ƒ, Symbol(Symbol.iterator): ƒ]
}
func(1,2,3)

一定要注意,arguments是存储传递的所有实参,默认参数是不会存储的

function func(firstArg = 0, secondArg = 1, thirdArg = 2) {
	console.log(arguments[0], arguments[1], arguments[2]);//10 undefined undefined
	console.log(firstArg, secondArg, thirdArg);//10 1 2
}
func(10);

Arguments转真实数组

var args = Array.prototype.slice.call(arguments);
var args = [].slice.call(arguments);
 
// ES2015
const args = Array.from(arguments);
const args = [...arguments];

callee获取当前arguments所在的函数

 注意:Arguments.callee()可以调用函数本身当函数正在执行时才可调用,可以实现方法的递归调用。Arguments.callee是代表当前函数,但是不会调用。

function func() {
	console.log("获取当前所在的函数");
	console.log(arguments.callee)
}
func()

打印结果如下:

通过Arguments.callee()实现递归求和(严格模式下不能使用)

var sum = function(n) {
	if (n == 1) {
		return 1;
	} else {
		return n + arguments.callee(n - 1);
	}
}
console.log("sum =", sum(5));//15

Arguments使用案例

a.求任意个数数字的最大值

function getMax() {
	console.log(arguments);
	let max = arguments[0];
	for (var i = 1; i <= arguments.length; i++) {
		max = arguments[i] > max ? arguments[i] : max;
	}
	return max;
}
console.log(getMax(11, 22, 5));//22
console.log(getMax(11, 22, 13, 23, 4, 5));//23

arguments与剩余参数、默认参数和解构赋值参数的结合使用

当非严格模式中的函数没有包含剩余参数默认参数解构赋值,那么arguments对象中的值跟踪参数的值。

function func1(a) { 
  arguments[0] = 99;   // 更新了arguments[0] 同样更新了a
  console.log(a);// 99
}
func1(100); 
 
// 并且
 
function func2(a) { 
  a = 99;              // 更新了a 同样更新了arguments[0] 
  console.log(arguments[0]); // 99
}
func2(100);

严格模式下的函数没有包含剩余参数默认参数解构赋值,那么arguments对象中的值也不会跟踪参数的值。

function func1(a) { 
  'use strict';
  arguments[0] = 99;   // 不会更新arguments[0] 也不会更新a
  console.log(a);// 100
}
func1(100); 
 
// 并且
 
function func2(a) { 
  'use strict';
  a = 99;              // 不会更新a 也不会更新arguments[0] 
  console.log(arguments[0]); // 100
}
func2(100);

③当非严格模式中的函数包含剩余参数默认参数解构赋值,那么arguments对象中的值不会跟踪参数的值。(这里以包含默认参数做示范)

function func1(a = 2) { 
  
  arguments[0] = 99;   // 不会更新arguments[0] 也不会更新a
  console.log(a);// 100
}
func1(100); 
 
// 并且
 
function func2(a = 2) { 
  a = 99;              // 不会更新a 也不会更新arguments[0] 
  console.log(arguments[0]); // 100
}
func2(100);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值