JavaScript基础——arguments对象、形参实参

目录

一、形参和实参

二、arguments对象

1. 和数组的关系

2. arguments经典示例


一、形参和实参

函数定义时列出的是形参,在函数调用时传递给函数真正值的是实参。如果函数在调用时未提供实际参数,参数会默认设置为undefined

示例1:

function test(x, y) {
  var x = 1;
  console.log(arguments[0]); //undefined
  console.log(arguments[1]); //undefined
}
test();

test()没有实参,因此参数默认设置为undefined。

示例2:

function test(x, y) {
  x = 3;
  console.log(arguments[0]); //3
  console.log(arguments[1]); //undefined
}
test(2);

test函数里的 x = 2; 直接修改了函数声明时的形参,因此x和arguments[0]都修改为3。通过修改arguments[0]达到的效果也一样。

示例3:

function test(x, y) {
  var x = 1;
  console.log(arguments[0]); //1
  console.log(arguments[1]); //undefined
}
test(2);

test函数里的 var x = 1;  属于在函数内部声明的局部变量与形参同名的情况,如果声明的变量已经赋值了,那么这时的x仍然是参数x,会修改函数内的参数,但如果只声明却没有赋值,那么输出的就是2。

二、arguments对象

由于JavaScript允许函数有不定数目的参数,所以需要一种机制,可以在函数体内部读取所有参数,因此Javascrip规定每个函数都有一个Arguments对象实例arguments,它引用着函数的实参,可以用数组下标的方式"[]"引用arguments的元素。其中通过arguments对象的length属性,可以判断函数调用时传递的实际参数个数

1. 和数组的关系

(1)虽然arguments很像数组,但它是一个对象。数组专有的方法(比如slice和forEach),不能在arguments对象上直接使用。

(2)如果要让arguments对象使用数组方法,真正的解决方法是将arguments转为真正的数组

var args = Array.prototype.slice.call(arguments);  //arguments对象转为数组

2. arguments经典面试题

var length = 1;
function fn () {
  console.log(this.length);
}
var obj = {
  length:2,
  method:function (fn) {
    console.log(this.length); //2
    fn(); //1
    arguments[0](); //1,原因见下
  }
};

obj.method(fn);

首先,我们知道arguments实际上是一个对象,并不是数组,它的内部结构对应如下:

arguments = {
  0:fn,
  1: 第2个参数, //没有
  2:第3个参数, //没有
  length:1
};

因为对象属性的读取方法可以使用点运算符或方括号运算符,所以arguments[0]( ) 也就是arguments.0( ),而“0”是 fn,是典型的对象.方法名(),因此函数 fn内部的 this指向的是这个对象 arguments,因此输出的 this.length 也就是arguments.length,等于1

参考资料

1. 腾讯面试题-----JavaScript中arguments对象解析

2. JavaScript 函数参数-Arguments(实参)对象

3. 字节头条面试踩坑arguments

4. 面试题之arguments[0]()

猜你喜欢

转载自blog.csdn.net/huaf_liu/article/details/115430146
今日推荐