深入解析JavaScript中的arguments对象


Posted in Javascript onJune 12, 2016

arguments定义

所有的函数都有一个自己的arguments对象,用来储存它实际接受到的参数,而不局限于函数声明时所定义的参数列表。它不是数组却类似数组,具有数组一样的访问性质及方式,可以由arguments[n]来访问对应的单个参数的值,并拥有数组长度属性length。但是却不具有数组的一些方法。可以通过call把arguments转化成真正的数组,然后进行数组的操作。

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

类数组

1. 判断ARGUMENTS是不是数组

alert(arguments instanceof Array);
alert(arguments instanceof Object);

2. 如何严格的判断一个数据是数组(ARRAY)类的实例

function isArray(value){
  if (typeof Array.isArray === "function") {
    return Array.isArray(value);
  }else{
    return Object.prototype.toString.call(value) === "[object Array]";
  }
}

3. 把ARGUMENTS转换成数组
方法一:内置的类型可以通过prototype找到内置的属性方法,Array.prototype.slice就是访问Array的内置方法slice。通过slice方法,返回一个数组。call是调用一个对象的方法,以另外一个对象替换当前对象。

var arg = Array.prototype.slice.call(arguments,0);

方法二:比方法一性能要差一点,因为它是先创建一个数组,然后再进行的

var arg = [].slice.call(arguments,0);

方法三:通过循环转变成数组

function toArray(arguments){
  var a = [];
  for(var i=0;i<arguments.length;i++){
    a.unshift(arguments.[i]);
  }
  return a;
}

caller

当一个函数被另一个函数调用的时候,被调用的函数会自动生成一个caller属性,指向调用它的函数对象,如果函数未被调用,则caller为null。

function testCaller() {
  var caller = testCaller.caller;
  alert(caller);
}
function aCaller() {
  testCaller();
}
aCaller();

弹出的是函数aCaller的内容。

arguments.callee
arguments.callee指向正在运行的函数自身,返回正被执行的 Function 对象,也就是所指定的 Function 对象的正文。
注意:arguments.length是实参长度,arguments.callee.length是形参长度,通常用来判断形参与实参长度是否一致
通过arguments获得函数的实参,通过arguments.callee获得函数的形参。
在闭包中应用的也比较广泛。

var i = 0;

  function b(num) {

    if (num < 10) {

      num++;

      i++;

      //如果有参数,callee也要把参数带上;

      arguments.callee(num);

    } else {

      //输出2次

      alert("调用了"+i+"次callee!");

    }

  }

  b(8);

 Arguments.callee在闭包中的应用,它提供了一种递归调调用的功能。

//用arguments.callee计算10的阶乘,例如: 1×2×3×4×5×6×7....

  function c(x) {

    return x > 1 ? x * arguments.callee(x - 1) : 1

  } (10);

  //输出6

  alert(c(3));

  //输出3628800

  alert(c(10));

例:callee求1-n的和

function fn(n){
  if(n==1) return n;
  else return n+arguments.callee(n-1);
}

它可以让一个匿名函数自己调用自己

例:

function list(type){
  var result = "<"+type+"l><li>";
  var args = Array.prototype.slice.call(arguments,1);
  result += args.join("</li><li>");
  result += "</li></"+type+"l>";
  return result;
}
var listHtml = list("o","one","two");
console.log(listHtml);

例2:面试题:下面的console.log结果是[1,2,3,4]的是?

function foo(x){
  console.log(arguments);
  return x;
}
foo(1,2,3,4);
function foo(x){
  console.log(arguments);
  return x;
}(1,2,3,4)

在预解释的时候,function fn(){}(1);会被分开处理,分成两个函数,第一个是function fn() {},而第二个则为匿名函数:(1)。如果第二个不带参数,就会报错,但是上面的函数包含在一个()里面,则是正确的。

(function fn(){
  console.log(arguments);
}(1,2,3,4));
(function foo(x){
  console.log( arguments);
  return x;
})(1,2,3,4)
function foo(){
  bar.apply(null,arguments);
}
function bar(x){
  console.log(arguments);
}
foo(1,2,3,4);
Javascript 相关文章推荐
JS学习之一个简易的日历控件
Mar 24 Javascript
通过百度地图获取公交线路的站点坐标的js代码
May 11 Javascript
jquery给图片添加鼠标经过时的边框效果
Nov 12 Javascript
JS操作iframe里的dom(实例讲解)
Jan 29 Javascript
javascript中局部变量和全局变量的区别详解
Feb 27 Javascript
javascript实现的多个层切换效果通用函数实例
Jul 06 Javascript
JavaScript Math 对象常用方法总结
Apr 28 Javascript
IScroll5 中文API参数说明和调用方法
May 21 Javascript
jquery 判断selection range 是否在容器中的简单实例
Aug 02 Javascript
基于javascript的Form表单验证
Dec 29 Javascript
JavaScript实现连连看连线算法
Jan 05 Javascript
jQuery实现根据身份证号获取生日、年龄、性别等信息的方法
Jan 09 jQuery
基于css3新属性transform及原生js实现鼠标拖动3d立方体旋转
Jun 12 #Javascript
JS弹出窗口插件zDialog简单用法示例
Jun 12 #Javascript
jQuery实现拖拽页面元素并将其保存到cookie的方法
Jun 12 #Javascript
仅一个form表单 js实现注册信息依次填写提交功能
Jun 12 #Javascript
JS+HTML5手机开发之滚动和惯性缓动实现方法分析
Jun 12 #Javascript
浅谈如何实现easyui的datebox格式化
Jun 12 #Javascript
JQuery的attr 与 val区别
Jun 12 #Javascript
You might like
phpfans留言版用到的数据操作类和分页类
2007/01/04 PHP
解析htaccess伪静态的规则
2013/06/18 PHP
浅谈php命令行用法
2015/02/04 PHP
理清PHP在Linxu下执行时的文件权限方法
2017/06/07 PHP
php连接mysql之mysql_connect()与mysqli_connect()的区别
2020/07/19 PHP
JavaScript 原型继承之构造函数继承
2011/08/26 Javascript
Javascript核心读书有感之表达式和运算符
2015/02/11 Javascript
7个有用的jQuery代码片段分享
2015/05/19 Javascript
Bootstrap每天必学之按钮(一)
2015/11/24 Javascript
JS在一定时间内跳转页面及各种刷新页面的实现方法
2016/05/26 Javascript
详解AngularJS controller调用factory
2017/05/19 Javascript
微信小程序用户授权、位置授权及获取微信绑定手机号
2019/07/18 Javascript
浅析Angular 实现一个repeat指令的方法
2019/07/21 Javascript
javascript移动端 电子书 翻页效果实现代码
2019/09/07 Javascript
js属性对象的hasOwnProperty方法的使用
2021/02/05 Javascript
Python中itertools模块用法详解
2014/09/25 Python
详细讲解用Python发送SMTP邮件的教程
2015/04/29 Python
Python标准库之Sys模块使用详解
2015/05/23 Python
解析Python中while true的使用
2015/10/13 Python
python 实现将txt文件多行合并为一行并将中间的空格去掉方法
2018/12/20 Python
使用Python检测文章抄袭及去重算法原理解析
2019/06/14 Python
python中的colorlog库使用详解
2019/07/05 Python
vscode 配置 python3开发环境的方法
2019/09/19 Python
Python爬取爱奇艺电影信息代码实例
2019/11/26 Python
Jmeter HTTPS接口测试证书导入过程图解
2020/07/22 Python
pandas抽取行列数据的几种方法
2020/12/13 Python
“型”走纽约上东区:Sam Edelman
2017/04/02 全球购物
洛杉矶时尚女装系列:J.ING US
2019/03/17 全球购物
慕尼黑山地运动、户外服装和体育用品专家:Sporthaus Schuster
2019/08/27 全球购物
介绍一下游标
2012/01/10 面试题
介绍一下.NET构架下remoting和webservice
2014/05/08 面试题
检察官就职演讲稿
2014/01/13 职场文书
项目考察欢迎辞
2014/01/17 职场文书
网吧员工管理制度
2015/08/05 职场文书
治庸问责工作总结
2015/08/11 职场文书
一文了解MYSQL三大范式和表约束
2022/04/03 MySQL