zoukankan      html  css  js  c++  java
  • js 的arguments的一些理解资料

    初学js的时候,对arguments这个东西常见,就是搞不清他的意思~ 下面是我找到的一些资料和我的理解,终于弄懂了这个家伙

        首先arguments指向实参对象

      在函数体内,标识符arguments是指向实参对象的引用,实参对象是一个类数组对象 arguments[0],arguments.length,类数组不是数组,虽然也有数组的前面这两种属性,具体判断可以使用instanceof来判断一下

    instanceof 用于判断一个实例是否是某种类型
    在 typeof 方法返回 “object” 的情况下,instanceof 方法还是很有用的。

    arrayLike instanceof Array
     // false
    其值是布尔值那么问题来了

    arguments是什么?
    1.  arguments是收到的实参副本
      在词法分析中, 首先按形参形成AO的属性,值为undefined
      当实参传来时, 再修改AO的相应属性.
    2:并把所有收到实参收集起来,放到一个arguments对象里
      function t(a,b,c){},
      调用时: t(1,2,3,4,5) 5个参数,这里传入了5个参数
      此时 , AO属性只有a,bc,3个属性, 但是arguments里有1,2,3,4,5, 所有的值,这个arguments就用来存储传入的所有参数

      对于超出形参个数之外的实参, 可以通过arguments来获得
    3.   arguments 的索引 从 0, 1,2,....递增,与实参逐个对应
    4.  arguments.length 属性代表实参的个数
    5.  arguments一定不是数组, 是长的比较像数组的一个对象,虽然也有length属性
      6:arguments每个函数都会有,因此,arguemnts只会在内部找自身的arguments,
      无法引用到外层的arguments
     

     1  <script type="text/javascript">
     2   // 求圆形面积,矩形面积, 三角形面积
     3   function area () {
     4   if(arguments.length == 1) {
     5   alert(3.14 * arguments[0] * arguments[0]);
     6   } else if(arguments.length == 2) {
     7   alert(arguments[0] * arguments[1]);
     8   } else if(arguments.length == 3) {
     9   alert(arguments[0] + arguments[1] + arguments[2]);
    10   } else {
    11   return null;
    12   }
    13   }
    14   area(10,20,30);
    15   
    16   </script>

    下面是W3C上的一些解释

    arguments 对象

    在函数代码中,使用特殊对象 arguments,开发者无需明确指出参数名,就能访问它们。

    例如,在函数 sayHi() 中,第一个参数是 message。用 arguments[0] 也可以访问这个值,即第一个参数的值(第一个参数位于位置 0,第二个参数位于位置 1,依此类推)。

    因此,无需明确命名参数,就可以重写函数:

    function sayHi() {

      if (arguments[0] == "bye") {

        return;

      }

      alert(arguments[0]);

    }

    检测参数个数

    还可以用 arguments 对象检测函数的参数个数,引用属性 arguments.length 即可。

    下面的代码将输出每次调用函数使用的参数个数:

     1 function howManyArgs() {
     2 
     3   alert(arguments.length);
     4 
     5 }
     6 
     7  
     8 
     9 howManyArgs("string", 45);
    10 
    11 howManyArgs();
    12 
    13 howManyArgs(12);

    上面这段代码将依次显示 "2"、"0" 和 "1"。

    注释:与其他程序设计语言不同,ECMAScript 不会验证传递给函数的参数个数是否等于函数定义的参数个数。开发者定义的函数都可以接受任意个数的参数(根据 Netscape 的文档,最多可接受 255 个),而不会引发任何错误。任何遗漏的参数都会以 undefined 传递给函数,多余的函数将忽略。

  • 相关阅读:
    记ByteCTF中的Node题
    Hooks中的useState
    IntersectionObserver对象
    Service Worker的应用
    使用 SpringBoot 构建一个RESTful API
    创业和技术有什么相通的“底层逻辑”?
    SpringBoot Profiles 多环境配置及切换
    SpringBoot Logback 日志配置
    应用分层和领域模型规约
    SpringBoot 整合 MyBatis,实现 CRUD 示例
  • 原文地址:https://www.cnblogs.com/nostic/p/5406472.html
Copyright © 2011-2022 走看看