目录
一、知识点
二、难点
一、知识点
????????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?');
/*
可以看到只写了一个形参,但是依旧可以传入多个实参(实际上不限个数)
*/
二、难点
????????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);
|