深入理解函数的arguments对象

目录

一、知识点

二、难点


一、知识点

        1.形参的命名并不是必须写的,它只是方便开发者用来辨别不同参数

        2.用function关键字定义(非箭头)函数时,可以在函数内部访问arguments对象,从中获得传进来的每个实参

        3.arguments对象是一个类数组对象(并非Array实例),所以访问第一个实参是arguments[0],访问第二个是arguments[1],同理可以通过arguments.length来确定传进来多少个实参

function sayHi() {
    console.log(arguments.length); //通过arguments.length属性可以得知传入的实参个数为2
    console.log("Hello " + arguments[0] + ", " + arguments[1]); // Hello coderXian, how are you?
}
sayHi('coderXian', 'how are you?');

        4.arguments对象和命名参数可以一起使用

        5.形参的数量和传入的实参数量不一致也没关系,ECMAScript函数不关心(形参数量>实参数量会 undefined,前提是形参要引用的情况下)

function sayHi(name) {
    console.log("Hello " + name + ", " + arguments[1]); // Hello coderXian, how are you?
}
sayHi('coderXian', 'how are you?');

/*
	可以看到只写了一个形参,但是依旧可以传入多个实参(实际上不限个数)
*/

        6.给形参初始化值(不论是es5还是es6的方式),并不会影响arguments对象,它始终以调用函数时传入的实参为准

function getInfo(info = "Hello world") {
    info = "great";
    console.log(arguments[0]);
}
getInfo(); // undefined
getInfo("nice"); //nice

二、难点

        1.arguments对象的值始终会与对应的命名参数同步(单向同步)

function doAdd(num1, num2) {
    arguments[1] = 10; //此时修改了arguments[1]的值,同时num2的值也会被修改
    console.log(arguments[0] + num2); // 11
}
doAdd(1, 2);

/*
	这并不意味着它们都访问同一个内存地址,它们在内存中还是分开的,只不过会保持同步而已
*/

        2.这种同步是单向同步的,如果修改的是命名参数的值,那么arguments对象中对应的值并不会被修改

function doAdd(num1, num2) {
    arguments[1] = 10;
    num2 = 20; 
    console.log(arguments[1]); // 10
    console.log(num1 + arguments[1]); // 11
}
doAdd(1);

/*
	可以看到虽然我们修改了num2的值,但是对应的arguments[1]的值依旧是10
*/

        3.没有传入实参,而在函数内去修改arguments对象对应的值,那么函数内这个命名参数的值是undefined

        4.arguments对象的长度是根据传入的实参数确定的,并不是根据命名参数(形参)数量决定的

function doAdd(num1, num2) {
    arguments[1] = 10;
    console.log(num2); // undefined,没有给num2传入值,虽然修改了arguments[1]的值,但是并不会同步到num2中
    console.log(arguments.length); // 1,根据传入的实参数量确定的
    console.log(num1 + num2); // NaN,因为num2是undefined
    console.log(num1 + arguments[1]); // 11,因为arguments[1]设置了值
}
doAdd(1);

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值