新年第一记,从这里开始,先来个简单的!去年的知识梳理留下了很多尾巴,原因有很多(知识储量不足,懒了,项目多...) lg:都是借口~   好吧,我承认,这都是借口,今年一定把尾巴清干净!

下面要写的是知识梳理的第一个案例:

  1. 写一个求和的方法sumFn,不管传递的参数有什么,都能将最终的和算出来,并且返回给函数外部使用。(要求:一个参数都不传默认结果为0,对于传递的非正常数字的参数不与累加操作);

这个案例主要要考察的知识点是 arguments 参数,来给个特写,什么意思呢?

arguments 参数是一个比较特殊的对象,是当前函数的一个内置属性,它非常想Array,但却不是Array lg:说的什么,还是不懂~  额,好吧,例子胜过一切雄辩,咱们举几个栗子来看看:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function abc(a,b,c){
       //看看arguments是什么
    console.log(arguments);
}
 
abc(1,2,3)  ;  //[1,2,3] 这不是数组吗
 
 
function abc(a,b,c){
       //看看arguments是什么类型的
    console.log(typeof arguments)  
}
 
abc(1,2,3)  ;  //object   这是对象,不是数组

看看,是不是有点意思,似数组非数组  lg:那它怎么用呢~  这个问题问的好,看下面代码:

1
2
3
4
5
6
7
8
9
function abc(a,b,c){
    var len = arguments.length;
    console.log(len);
    console.log(arguments[0]);
    console.log(arguments[1]);
}
abc(1,2,3); // 3 , 1 , 2
 
//长度为3,第一个值为1,第二个值为2...  看来是具有对应关系的

lg:就只有这2下子?一点都不好玩~   呵,你还急了,当然不只这两下子啊,它有一个非常实用的功能,就是在函数中,无需明确指出参数名,arguments能直接访问它,你说屌不屌,耳听为虚,眼睛为使:

1
2
3
4
5
6
7
8
function abc(){
    var a = arguments;
    var num = arguments[0] + arguments[1] + arguments[2]; //这里可以用循环,为方便查看,拆开了写,你懂的
    console.log(num);
}
abc(1,2,3); // 6  说明可以获取
 
//正常来说,函数没有参数,应该是要报错的,如果能成功运行,说明它具备这个神级

lg:果然了得啊,那它还有没有其他的吊炸天技能呢? 当然有啦!arguments对象中有一个非常有用的属性:callee。arguments.callee返回此arguments对象所在的当前函数引用。在使用函数递归调用时推荐使用arguments.callee代替函数名本身。举个栗子:

1
2
3
4
5
6
7
8
9
function abc(a){
  if(a==1){
    console.log(arguments.callee);
//直接输出当前函数
    return 1;
  }
  return a + arguments.callee(--a);
}
         
var mm = abc(10);
console.log(mm); // 55<br><br>//arguments.callee(--a) 执行了递归调用,这样就完成了1~9的累加

看到这里,上面说的例子应该就不难写了吧,来跟着我左手右手一个慢动作:

function sumFn(){
  var arg = arguments;
 var sum = 0;
  if(arg == '' || arg == ' ' || arg ==null){
    sum = 0;
  }else{
    for(var i=0;i<arg.length;i++){
      if(isNaN(arg[i]) || arg[i] == '' || arg[i] ==' '){
        sum = sum;
      }else{
        sum +=arg[i];
      }
    }
  }
  return sum;
} var num1 = sumFn(2) + sumFn(3);
console.log(num1); // var num2 = sumFn(2,3,4);
console.log(num2); // var num3 = sumFn();
console.log(num3); //0
var num4 = sumFn(1,'e',6);
console.log(num4); //

到这里,不知道你对这个例子理解了没有,  lg: 这么好的东西,兼容性怎么样呢?  哈哈,这么吊炸天的东西,兼容性还特别的好,你说气不气人,经测试,支持所有浏览器!

好了,它是对象,它也有对象,但是我还没有对象,呜呜呜~~~,我要去找对象去了!

行文仓促!有理解的不正确的或者是遗漏的东西,万望批评指正!不胜感激!

出处:http://www.cnblogs.com/liugang-vip/p/5201146.html

arguments对象的实例使用的更多相关文章

  1. 函数, arguments对象, eval,静态成员和实例成员

    函数创建: 3种创建函数的方式    * 直接声明函数 function funcName(/*参数列表*/){ //函数体 } * 函数表达式 var funcName = function(){ ...

  2. [Effective JavaScript 笔记]第23条:永远不要修改arguments对象

    arguments对象并不是标准的Array类型的实例.arguments对象不能直接调用Array方法. arguments对象的救星call方法 使得arguments可以品尝到数组方法的美味,知 ...

  3. python—类对象和实例对象的区别

    最近在对RF的通讯层的模块进行封装,需要将之前放在类似main里面的一个方法,如下所示:这段代码是开发提供,用于接口测试,模拟底层通讯,具体的通讯是在dll内,python这边只是做了个封装让RF进行 ...

  4. JavaScript基础精华02(函数声明,arguments对象,匿名函数,JS面向对象基础)

    函数声明 JavaScript中声明函数的方式:(无需声明返回值类型) function add(i1, i2) {             return i1 + i2;//如果不写return返回 ...

  5. arguments对象,caller 和 callee

    arguments对象是比较特别的一个对象,arguments非常类似Array,但实际上又不是一个Array实例. 它指的是函数对象里的参数,且只能在函数内部使用. 使用 检测函数的参数个数,引用属 ...

  6. jacascript 函数参数与 arguments 对象

    前言:这是笔者学习之后自己的理解与整理.如果有错误或者疑问的地方,请大家指正,我会持续更新! 调用函数时,实参和形参需要一一对应,但如果参数多了的话,会很苦恼: 我们可以用键值对(字面量对象)的方式传 ...

  7. 函数的形参和实参之arguments对象

    当函数调用函数时候传入的实参比函数声明时候制定的形参要少时候,剩余的形参就设置成了undefined.例如 function getPropertyNames(o,/*optional*/a){ va ...

  8. JavaScript-创建日志调试对象(面向对象实例)

    参考自http://www.2cto.com/kf/201312/261990.html IC.js文件 自己封装的js类库 /** * * @authors Your Name (you@examp ...

  9. JavaScript arguments对象

    1.在JavaScript中,arguments对象是比较特别的一个对象,实际上是当前函数的一个内置属性.arguments非常类似Array,但实际上又不是一个Array实例.可以通过如下代码得以证 ...

随机推荐

  1. 更改eclipse(myeclipse) author的默认名字(注释的作者)

    在eclipse/myeclipse中,当添加注释的作者选项时,@author 后边一般都会默认填充的你登录计算机的用户名.如何去修改呢:第一种方法:修改计算机登录的用户名(一般不实用)第二种方法:修 ...

  2. vue v-on命令

    <!-- 阻止单击事件冒泡 --> <a v-on:click.stop="doThis"></a>   <!-- 提交事件不再重载页面 ...

  3. LeetCode:三个数的最大乘积【628】

    LeetCode:三个数的最大乘积[628] 题目描述 给定一个整型数组,在数组中找出由三个数组成的最大乘积,并输出这个乘积. 示例 1: 输入: [1,2,3] 输出: 6 示例 2: 输入: [1 ...

  4. 【leetcode刷题笔记】3Sum

    Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all un ...

  5. AC自动机的一点理解

    \(fail\)指针:指向最长的在\(tire\)里出现的后缀 比\(tire\)多出来的子边:原来的\(tire\),我们失配后又得返回根结点再次匹配,而加入这些边后只需要花\(strlen(s)\ ...

  6. bigdecimal类型除法问题

    坑:bigdecimal类型做除法运算时,结果为整数或有限小数时候不存在问题,若结果无法整除,为无限小数时报错 错误代码: Bigdecimal  b = a.divide(c).setScale(5 ...

  7. ICP 求解相机思路

    1.之前仍然是需要创建find_feature_matches,和pixel2cam,一个是用来匹配描述子的,一个是把像素坐标转成归一化平面坐标的.里面的变量都要带上&.2.因为是3d-3d. ...

  8. MySQL存储过程入门教程

    存储过程介绍 存储过程是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中.用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它.存储过程可由应用程序通过一个调用来执行,而且 ...

  9. Docker-端口映射与容器互联

    在使用docker过程中,通常会碰到需要多个服务组件容器共同协作的情况,这往往需要多个容器之间有能够互相访问到对方的服务除了通过网络访问外,Docker还提供了两个很方便的功能来满足服务访问的基本需求 ...

  10. 更改ubuntu主机名称

    vim /etc/hostname 将root更改为admin vim /etc/passwd