字节头条面试踩坑arguments

1,574 阅读2分钟

一、定义

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区别比较 宏观任务与微观任务详解