小米技术社区
小米技术社区管理员 关于小米

27岁,山西运城人,职业电商经理人,前端开发工作者,从事过网站建设、网络推广、SEO、SEM、信息流推广、二类电商、网络运维、软件开发,等相关电商工作,经验较为丰富,小米技术社区致力于为广大从事Web前端开发的人员提供一些力所能及的引导和帮助 ...[更多]

E-mail:mzze@163.com

Q Q:32362389

W X:xiaomi168527

小米技术社区大牛王飞 关于王飞

27岁,山西运城人,职业电商经理人,网络工程师兼运维,从事过运营商网络建设,企业网络建设、优化。数据中心网络维护等通过,经验丰富,座右铭:当自己休息的时候,别忘了别人还在奔跑。 ...[更多]

E-mail:wf_live@126.com

Q Q:3940019

微博:王小贱ss

小米技术社区设计小艳 关于小艳

大于花一样的年龄,河南郑州是我家,2010年在北京接触团购网,2011年进入天猫淘宝一待就是四年,如今已经将设计走向国际化(ps:误打误撞开始进入阿里巴巴国际站的设计,嘿嘿)五年电商设计,丰富经验,从事过天猫淘宝阿里各项设计,店铺运营,产品拍摄;我将我的经历与您分享是我的快乐!座右铭:越努力越幸运! ...[更多]

E-mail:97157726@qq.com

Q Q:97157726

标签云
精品推荐
  • 什么是闭包?js闭包的2个最大用途以及注意事项

    什么是闭包?js闭包的2个最大用途以及注意事项

    各种专业文献上的"闭包"(closure)定义非常抽象,很难看懂。简单的说,闭包就是能够读取其他函数内部变量的函数。由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,因……
    134人已经看过了
您的位置:首页 > 前端开发 > Javascript > 原生JS

函数内部的arguments对象(类数组的对象)

分类: 原生JS32个赞

我们先来通过一个小案例了解一下函数内部的arguments对象的作用

//定义函数

    function f(m,n){
        return m + n;
    }
    console.log( f(1,2) );

注意:函数的参数  实参和形参 个数可以不一致


问题:如果实参传过来的数量不确定怎么办?这时候要用到函数的arguments对象


//封装一个函数,计算所有实参的和

    function fn(){
        //arguments对象(类数组的对象): 用来获取所有的实参
        // console.log(arguments);
        // console.log(arguments[0]);
        // console.log(arguments[1]);
        // console.log(arguments.length);
        var sum = 0;
        for(var i=0; i<arguments.length; i++){
            //arguments[i] 是一个实参
            sum += arguments[i];
        }
        return sum;
    }
 console.log( fn(1) );
 console.log( fn(1,2) );
 console.log( fn(3, 4, 5) );


arguments案例:

function arg(){
            console.log(arguments);
        };
        arg("tom",[1,2,3],{age:18})

arguments案例

可以看到下面打印出来的结果,arguments是有值的,它的值就是我们传递进去的参数,虽然我们没有给fun函数定义形参,但是我们还是可以通过arguments来调用传递给函数fun的实参。

此外,我们可以看到arguments还有属性callee,length和迭代器Symbol。

1.我们发现callee的值是函数arg,是不是说callee指向函数arg,我们来测试一下

function arg(){
            console.log("arguments.callee === arg()的值",arguments.callee === arg)
        };
        arg("tom",[1,2,3],{age:18})

结果如我们想的一样,callee就是指向函数fun。

arguments的callee值和函数一样

2.第二个属性length,我们经常在数组或者类数组中看到,可以看到arguments的原型索引__proto__的值为Object,故此我们推测arguments不是数组,而是一个类数组对象。

function arg(){
            console.log(arguments instanceof Array);
            console.log(Array.isArray(arguments))
        };
        arg("tom",[1,2,3],{age:18})

结果打印出来的值都是false,说明arguments不是数组,而是一个类数组对象。

arguments是一个类数组

3.第三个属性是个Symbol类型的键,该类型的值都是独一无二的,该键指向的值是一个values函数,

该值是一个生成迭代器的函数

在arguments中有同样的效用。

function arg(){
            console.log( arguments[Symbol.iterator]);let iterator = arguments[Symbol.iterator]();console.log( "iterator: ",iterator);
            console.log(iterator.next());
            console.log(iterator.next());
            console.log(iterator.next());
            console.log( iterator.next());
        }
            arg("tom",[1,2,3],{age:18})

arguments的Symbol键

小米技术社区

本站内容均为小米原创,转载请注明出处:小米技术社区>> 函数内部的arguments对象(类数组的对象)