在javascript中,函数是没有重载这一项的,所谓的重载,一个函数可以有多个,就是参数的个数和形式不同所以引用的功能不同,而js不存在函数重载,不管传不传参数,函数里面是否引用,关系都不大,一个函数对应一个功能,但是函数可以模拟函数重载,所以有一个Arguments对象。

定义

arguments是一个对应于传递给函数的参数的类数组对象。

类数组:是数组的形式,有length,但不具有数组的一切方法

描述

arguments对象是所有(非箭头)函数中都可用的局部变量。你可以使用arguments对象在函数中引用函数的参数。此对象包含传递给函数的每个参数,第一个参数在索引0处。

箭头函数没有arguments对象

arguments是函数中必有的对象,用来读取调用该函数的参数

  1. function foo(){
  2. console.log(arguments[0]) // 1
  3. console.log(arguments[1]) // 2
  4. console.log(arguments[2]) // 3
  5. }
  6. foo(1,2,3)

arguments对象不是数组,但可以通过其他方式转化为数组,进而使用数组的方法。

var args = Array.prototype.slice.call(arguments)

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

var args = Array.from(arguments)

var args = [...arguments]

  1. function foo() {
  2. var f = Array.prototype.slice.call(arguments);
  3. // var f = [].slice.call(arguments);
  4. // var f = Array.from(arguments);
  5. // var f = [...arguments];
  6. console.log(f) // [1,2,3]
  7. console.log(f instanceof Array) // true
  8. }
  9. foo(1, 2, 3)

属性

arguments既然是个对象,也有它的自带的属性。

  • length 长度,本次函数调用时传入函数的实参数量.

    • 表示的是实际上向函数传入了多少个参数,这个数字可以比形参数量大,也可以比形参数量小
    • 形参:全称“形参变量”,只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只在函数内部有效。函数调用结束返回主调用函数后则不能再使用该形参变量。
    • 实参:全称为"实际参数"是在调用时传递给函数的参数. 实参可以是常量、变量、表达式、函数等, 无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值, 以便把这些值传送给形参。 因此应预先用赋值,输入等办法使实参获得确定值。

      形参就是函数声明的参数,实参是函数调用的参数
  1. function foo(a,b){} // a,b代表形参
  2. foo(1,2) // 1,2代表实参
  • callee 当前正在执行的函数

    • 可以用于引用该函数的函数体内当前正在执行的函数(类似于递归)
    • es5之后废弃,但不代表不使用这个callee了
    • callee可以使用在匿名递归函数中。
      • 匿名函数 (通过 函数表达式 或者 函数构造器 创建) 没有名称。因此如果没有可访问的变量指向该函数,唯一能引用它的方式就是通过 arguments.callee。
      1. function create() {
      2. return function (n) {
      3. if (n <= 1)
      4. return 1;
      5. return n * arguments.callee(n - 1);
      6. };
      7. }
      8. var result = create()(5);
      9. console.log(result) // returns 120 (5 * 4 * 3 * 2 * 1)
      • 但不提倡使用callee来递归,最好形成有名函数,进而使用函数名递归。
      1. function create() {
      2. return function multiply(n) {
      3. if (n <= 1)
      4. return 1;
      5. return n * multiply(n - 1);
      6. };
      7. }
      8. var result = create()(5);
      9. console.log(result) // returns 120 (5 * 4 * 3 * 2 * 1)
  • caller 指向调用当前函数的函数
    • 原先用在函数执行的时候调用自身
    • 已废弃,不能用
  • arguments[@@iterator] 返回一个新的Array迭代器对象,该对象包含参数中每个索引的值。
    • 这个意思就是可以调用for-of循环 - -!
    1. function add(){
    2. for(var i of arguments){
    3. console.log(i) //1 2 3 4 5 6
    4. }
    5. }
    6. add(1,2,3,4,5,6)

特殊点

当arguments遇到剩余函数,解构赋值和默认参数的情况:

  • 在严格模式下,剩余参数、默认参数和解构赋值参数的存在不会改变 arguments对象的行为,
  1. "use strict"
  2. function func(...a) {
  3. a[0] = 11
  4. console.log(arguments);
  5. }
  6. func(1,2,3,4,5); // [1,2,3,4,5]
  7. function func1(a=4) {
  8. console.log(arguments);
  9. }
  10. func1(1); // [1]
  • 当非严格模式中的函数没有包含剩余参数、默认参数和解构赋值,那么arguments对象中的值会跟踪参数的值(反之亦然)
  1. function func(a) {
  2. arguments[0] = 99; // 更新了arguments[0] 同样更新了a
  3. console.log(a);
  4. }
  5. func(10); // 99
  6. function func1(a) {
  7. a = 99; // 更新了a 同样更新了arguments[0]
  8. console.log(arguments[0]);
  9. }
  10. func1(10); // 99
  • 当非严格模式中的函数有包含剩余参数、默认参数和解构赋值,那么arguments对象中的值不会跟踪参数的值(反之亦然)
  1. function func(a = 55) {
  2. arguments[0] = 99; // 更新了 arguments[0] 但没更新 a
  3. console.log(a);
  4. }
  5. func(10); // 10
  6. function func1(a = 55) {
  7. a = 99; // 更新了 a 但没更新arguments[0]
  8. console.log(arguments[0]);
  9. }
  10. func1(10); // 10
  11. function func2(a = 55) {
  12. console.log(arguments[0]);
  13. }
  14. func2(); // undefined

总结

前段时间看到arguments对象,不是很懂,所以抽空学习了一下。es6箭头函数的出现,arguments对象相对来说少用了,因为箭头函数没有arguments对象。再加上有一些属性都被遗弃。但是不能不学,所有的知识都是从底层创建出来的,了解底层知识是有好处的。

如果此文有什么不对的地方,欢迎评论私信,大家一起进步。我把我总结的知识点放到GitHub了,如果满意,给个star。

参考文献

MDN https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Functions/arguments

arguments对象详解的更多相关文章

  1. JavaScript arguments对象详解

    1. 什么是 arguments MDN 上解释: arguments 是一个类数组对象.代表传给一个function的参数列表. 我们先用一个例子直观了解下 JavaScript 中的 argume ...

  2. js对象详解(JavaScript对象深度剖析,深度理解js对象)

    js对象详解(JavaScript对象深度剖析,深度理解js对象) 这算是酝酿很久的一篇文章了. JavaScript作为一个基于对象(没有类的概念)的语言,从入门到精通到放弃一直会被对象这个问题围绕 ...

  3. JS变量对象详解

    JS变量对象详解 开年之后工作热情一直不是很高,这几天一直处于消极怠工状态.早上不想起床,起床了不想上班.明明放假之前工作热情还一直很高,一直心心念念的想把小程序项目怼出来,结果休假回来之后画风完全不 ...

  4. JavaScript进阶知识点——函数和对象详解

    JavaScript进阶知识点--函数和对象详解 我们在上期内容中学习了JavaScript的基本知识点,今天让我们更加深入地了解JavaScript JavaScript函数 JavaScript函 ...

  5. jQuery的deferred对象详解

    jQuery的deferred对象详解请猛击下面的链接 http://www.ruanyifeng.com/blog/2011/08/a_detailed_explanation_of_jquery_ ...

  6. Window 对象详解 转自 http://blog.csdn.net/jcx5083761/article/details/41243697

    详解HTML中的window对象和document对象 标签: HTMLwindowdocument 2014-11-18 11:03 5884人阅读 评论(0) 收藏 举报 分类: HTML& ...

  7. jQuery的deferred对象详解(转载)

    本文转载自: jQuery的deferred对象详解(转载)

  8. mvc-servlet---ServletConfig与ServletContext对象详解(转载)

    ServletConfig与ServletContext对象详解 一.ServletConfig对象    在Servlet的配置文件中,可以使用一个或多个<init-param>标签为s ...

  9. JS中的event 对象详解

    JS中的event 对象详解   JS的event对象 Event属性和方法:1. type:事件的类型,如onlick中的click:2. srcElement/target:事件源,就是发生事件的 ...

随机推荐

  1. 【Never Stop】联赛集训记录

    始于10/01/2017. Day I: T2图论,没想到.T3谜一样DP(是从来没意识到还可以这样). rank10. 下午刷了点题,CDQ也只打出一个板子,感觉自己不在状态? ========== ...

  2. BZOJ_3653_谈笑风生_树状数组

    BZOJ_3653_谈笑风生_树状数组 Description 设T 为一棵有根树,我们做如下的定义: ? 设a和b为T 中的两个不同节点.如果a是b的祖先,那么称“a比b不知道 高明到哪里去了”. ...

  3. BZOJ_3144_[Hnoi2013]切糕_最小割

    BZOJ_3144_[Hnoi2013]切糕_最小割 Description Input 第一行是三个正整数P,Q,R,表示切糕的长P. 宽Q.高R.第二行有一个非负整数D,表示光滑性要求.接下来是R ...

  4. BZOJ_3143_[Hnoi2013]游走_期望DP+高斯消元

    BZOJ_3143_[Hnoi2013]游走_期望DP+高斯消元 题意: 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机 ...

  5. Spring中bean的注入方式

    首先,要学习Spring中的Bean的注入方式,就要先了解什么是依赖注入.依赖注入是指:让调用类对某一接口的实现类的实现类的依赖关系由第三方注入,以此来消除调用类对某一接口实现类的依赖. Spring ...

  6. 用Service+Broadcast解决倒计时过程中Activity被销毁的问题

    主要思想是这样的:将倒计时CountDownTimer放在Service里面进行,每过一秒就一条发广播,在主Activity里注册广播,收到广播后更新UI. 一.写一个类CodeTimerServic ...

  7. SASS 中变量的默认值

    SASS 中定义的变量,后设置的值会覆盖旧的值. $color: red; $color: blue; .btn { color: $color; } 编译后为: .btn { color: blue ...

  8. Vue 进阶之路(五)

    之前的文章我们说了一下 vue 的样式绑定,这篇文章来介绍一下 vue 中的条件渲染,先看下面的代码: <!DOCTYPE html> <html lang="en&quo ...

  9. Unable to start embedded container; nested exception is org.springframework.context.ApplicationContextException: Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFa

    Springboot通过application启动报错 2019-01-25 14:02:33.810 ERROR [restartedMain] org.springframework.boot.S ...

  10. 面试官,你再问我 Bit Operation 试试?

    在面试环节中,面试官很喜欢问一些特别的题目,这些题目有着特殊的解法,如果回答的巧妙往往能在面试中加分. 在这些题目中,位操作(Bit Operation)就是极具魅力的一种.今天,吴师兄就来分享 Le ...