JS Arguments的主要特点
- 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
对象中的值会跟踪参数的值。
- 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);