JavaScript arguments 对象

🌙
手机阅读
本文目录结构

功能:存放实参的参数列表

test1(1,2);//[1,2]
test1(1,2,3,4,5);//[1, 2, 3, 4, 5]
function test1(){
  console.log(arguments);
}

argutments在普通模式里,可以在函数内部修改函数的值,但是不建议那么做;这点在严格模式下也有限制

  • 在严格模式,函数内部不能修改argument的值,即使修改了,操作也是无效的;
  • 其次重写arguments值会导致语法错误,代码不执行;

特性:

  • 仅能在函数体内使用
test1(1,2);//[1,2]
function test1(){
  console.log(arguments);
}
console.log(arguments);//Uncaught ReferenceError: arguments is not defined
  • 带有下标属性,但是并非数组
test1(1,2);//1 2 undefined
function test1(){
  console.log(arguments[0],arguments[1],arguments[2]);
}
  • 函数声明时自动初始化

  • 属性

    • 1.length 获取函数实参的长度
    test1(1,2,3,4,5);// 输出5
    function test1(){
      console.log(arguments.length);
    }
    
    • 2.callee 返回当前正在指向的函数
    test1(1,2,3,4,5);// 输出函数本身
    function test1(){
      console.log(arguments.callee);
    }
    
    • 3.caller 返回调用当前正在执行函数的函数名;在chrome里是没有的;尽量不要用arguments的这个属性;

      • 在chrome里的callee是arguments.callee.caller
      • 对于函数来说,caller 属性只有在函数执行时才有定义。 如果函数是由 Javascript 程序的顶层调用的,那么 caller 包含的就是 null 。
      function callerDemo() {
          if (arguments.callee.caller) {
              var a = callerDemo.caller.toString();
              console.log(a);
          } else {
              console.log("this is a top function");
          }
      }
      function handleCaller() {
          callerDemo();
      }
      handleCaller();
      function calleeDemo() {
          console.log(arguments.callee);
      }
      calleeDemo();
      

函数的参数是函数的灵魂

ECMA中的函数不在乎传来多少个参数,也不在乎你传进来的是什么类型的,即使你定义的函数值接受两个参数,在调用的时候未必严格的传进两个实参,你传一个,三个,不传都是没有问题的、这就是函数的多态

原理是因为ECMA是把函数用在内部用一个”数组”来表示的,函数接受到的始终都是这个数组,并不关心这个”数组”是否包含参数,已经包含的都是什么参数,可以通过arguments[index]这种的方式来访问,也可以通过arguments.length的值来确定传进来了多个参数;

function testArgument(){
    console.log("hello argument[0]:"+arguments[0]+" and argument[1]:"+arguments[1]);
}
testArgument("1","2");//hello argument[0]:1 and argument[1]:2
testArgument("1");//hello argument[0]:1 and argument[1]:undefined
testArgument();//hello argument[0]:undefined and argument[1]:undefined

函数的一个特点,形参只是提供了操作的便利,但并不是必须的;函数的定义和调用与参数是没有关系的,只有在函数内部引用了形参才与实参个数和值有关系;

如果函数只是定义了,但是没有执行,那就是脱裤子放屁了;因为对程序不会有任何意义;

function sum(a,b){
    if(arguments.length===2){
        console.log("第1个参数和第二个参数的和是:"+a+b);
    }else if(arguments.length===1){
        console.log("block,只传了一个参数 "+a+",让我如何相加")
    }else{
        console.log("我拒绝运算!")
    }
}
sum(10,8);//第1个参数和第二个参数的和是:108
sum(10);//block,只传了一个参数 10,让我如何相加
sum();//我拒绝运算!

上面就牵扯到了函数的多态,根据不同的参数来做不同的事情;

AXIHE / 精选资源

浏览全部教程

面试题

学习网站

前端培训
自己甄别

前端书籍

关于朱安邦

我叫 朱安邦,阿西河的站长,在杭州。

以前是一名平面设计师,后来开始接接触前端开发,主要研究前端技术中的JS方向。

业余时间我喜欢分享和交流自己的技术,欢迎大家关注我的 Bilibili

关注我: Github / 知乎

于2021年离开前端领域,目前重心放在研究区块链上面了

我叫朱安邦,阿西河的站长

目前在杭州从事区块链周边的开发工作,机械专业,以前从事平面设计工作。

2014年底脱产在老家自学6个月的前端技术,自学期间几乎从未出过家门,最终找到了满意的前端工作。更多>

于2021年离开前端领域,目前从事区块链方面工作了