• JS Arguments的使用


    JS Arguments的主要特点

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

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

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

    Arguments转真实数组

    1. var args = Array.prototype.slice.call(arguments);
    2. var args = [].slice.call(arguments);
    3. // ES2015
    4. const args = Array.from(arguments);
    5. const args = [...arguments];

    callee获取当前arguments所在的函数

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

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

    打印结果如下:

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

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

    Arguments使用案例

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

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

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

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

    1. function func1(a) {
    2. arguments[0] = 99; // 更新了arguments[0] 同样更新了a
    3. console.log(a);// 99
    4. }
    5. func1(100);
    6. // 并且
    7. function func2(a) {
    8. a = 99; // 更新了a 同样更新了arguments[0]
    9. console.log(arguments[0]); // 99
    10. }
    11. func2(100);

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

    1. function func1(a) {
    2. 'use strict';
    3. arguments[0] = 99; // 不会更新arguments[0] 也不会更新a
    4. console.log(a);// 100
    5. }
    6. func1(100);
    7. // 并且
    8. function func2(a) {
    9. 'use strict';
    10. a = 99; // 不会更新a 也不会更新arguments[0]
    11. console.log(arguments[0]); // 100
    12. }
    13. func2(100);

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

    1. function func1(a = 2) {
    2. arguments[0] = 99; // 不会更新arguments[0] 也不会更新a
    3. console.log(a);// 100
    4. }
    5. func1(100);
    6. // 并且
    7. function func2(a = 2) {
    8. a = 99; // 不会更新a 也不会更新arguments[0]
    9. console.log(arguments[0]); // 100
    10. }
    11. func2(100);

  • 相关阅读:
    谁用谁夸,超好用的电子期刊制作网站
    linux学习3 — ubuntu中的文件
    基于Python的飞机票销售系统的设计和实现
    JS深拷贝处理日期、正则以及循环引用问题
    Oracle-动态sql学习笔记,由易至难讲解七个例子
    php ci 框架准备工作
    从一道题到贪心入门
    uniapp 学习笔记二十一 路由跳转及产品详情数据渲染
    【kafka】——概述&安装
    ipad有必要用手写笔吗?性价比电容笔排行榜
  • 原文地址:https://blog.csdn.net/chaseqrr/article/details/126402582