一、定义
1、在函数调用的时候,浏览器每次都会传递进两个隐式参数:
一个是函数的上下文对象this
,另一个则是封装实参的类数组对象arguments
。
2、arguments
的定义是对象,但是因为对象的属性是无序的,而arguments
是用来存储实参的,是有顺序的,它具备和数组相同的访问性质及方式,并拥有数组长度属性length
,所以arguments
是特殊的对象,又叫类数组对象,当我们听到类数组时就可以知道说的是arguments
。
二、表现内容
arguments
是一个类数组对象,用来存储实际传递给函数的参数,使调用函数时不局限于函数声明所定义的参数列表。下面看一段代码
function fn (name, age, sex) {
console.log(name, age, sex); //Tom 18 undefined
// 函数对象的length属性就是函数形参的个数
console.log(fn.length); //3
}
fn('Tom', 18);
function fn (name, age, sex) {
console.log(arguments);
}
如图所示当fn传空是arguments.length是为空,验证它用来存储实际传递给函数的参数,即调用的fn('Tom',18,'boy')。
三、访问
arguments
访问单个参数的方式与访问数组元素的方式相同。例如arguments[0]
、arguments[1]
、arguments[n]
,在函数中不需要明确指出参数名,就能访问它们。通过length
属性可以知道实参的个数。
function f2() {
console.log(arguments[0]); // name
console.log(arguments[1]); // age
console.log(arguments.length); // 2
}
f2('name', 'age');
三、面试题原题
下面是遇到字节头条关于arguments的面试题
var length = 10;
function fn() {
alert(this.length);
}
var obj = {
length: 5,
method: function (fn) {
alert(this.length) // 5
fn(); //10
arguments[0](); //1
}
}
obj.method(fn);
这里的0是一个函数 执行的是method方法this.length 即长度只有一个参数fn 所以长度为1
补充:直接执行fn函数的时候this还是上面fn的this arguments[0]=fn参数 = 里面的this.length代码
附加另一道:juejin.cn/post/685967…
WEBGL探索之路 (二)--webgl场景构建 WEBGL探索之路 (一)--认识webgl js循环中如果操作了原数组会发生什么? 字节头条面试踩坑arguments js函数柯里化 强缓存与协商缓存属性定义集合 React Context 的理解以及应用 react shoudcomponentupdate 停止渲染 vue为什么不需要 深拷贝浅拷贝的十一种方法 import和require的区别比较 vue Vue $nextTick 深度解析 深度揭秘 Promise 微任务注册和执行过程 v8引擎如何执行一段js代码的? http3.0 2.0 1.0区别比较 宏观任务与微观任务详解