最近学习研究面试题,发现很多函数(深拷贝数组乱序节流防抖....)里面都有arguments这个对象参数,最开始百度了一下,是一个对应于传递给函数的参数的类数组对象,然后就绕过了TA...

然后今天学习 “柯里化函数”的时候,又撞见了arguments,还直接当变量用了,就知道我理解出问题了,看的太多片面,换句话说,把这个arguments想的太复杂了!

if (arguments.length == 2) {
    return arguments[0] + arguments[1];
}

arguments定义

  • MDN: arguments对象是所有(非箭头)函数中都可用的局部变量。
  • W3C: arguments是一个类数组对象,这个数组里面保存的是传递给一个函数的参数
  • 七娃:arguments就是函数调用时 传进来 的 变量 !!!

    
为什么这样说呢? 看下面的案例:

 let xxx =555;
function add(x){
let xx =555;
console.log(arguments)
}  
add(1,2,3)

js中的arguments对象详解!-QUI-Notes

最开始我理解MDN的定义,是函数内的局部变量都算arguments的内容,可是经过上面的测试发现,全局变量和函数内声明的变量都不算arguments的参数,arguments只接收add传进来的参数。那么,函数可以被接收吗?

function add(x){
console.log(arguments)
} 
function log(){
console.log(456)
}
add(1,2,3,log)

js中的arguments对象详解!-QUI-Notes
答案是肯定的,只要通过参数传进去的,无论什么类型,都会变成 arguments对象的内容!

arguments特点:

1.arguments对象不是一个 Array 。它类似于Array,但除了length属性和索引元素之外没有任何Array属性。

console.log(arguments.length)
console.log(arguments[0])

2.arguments对象可以转换为一个真正的Array数组

var args = Array.prototype.slice.call(arguments);
var args = [].slice.call(arguments);

ES2015

const args = Array.from(arguments);
const args = [...arguments];

3.typeof参数返回 'object'

console.log(typeof arguments);    // 'object'

END!又学习到一个小角落的知识点,如同沧海拾贝,加油打工人!