深入解析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 相关文章推荐
初探jquery——表单应用范例
Feb 20 Javascript
js实现表格字段排序
Feb 19 Javascript
详解JavaScript语法对{}处理的坑爹之处
Jun 05 Javascript
js控制页面的全屏展示和退出全屏显示的方法
Mar 10 Javascript
javascript实现粘贴qq截图功能(clipboardData)
May 29 Javascript
jquery mobile移动端幻灯片滑动切换效果
Apr 15 Javascript
bootstrap vue.js实现tab效果
Feb 07 Javascript
H5基于iScroll实现下拉刷新和上拉加载更多
Jul 18 Javascript
基于js粘贴事件paste简单解析以及遇到的坑
Sep 07 Javascript
jquery手机触屏滑动拼音字母城市选择器的实例代码
Dec 11 jQuery
Angular实现下拉框模糊查询功能示例
Jan 03 Javascript
JavaScript如何实现监听键盘输入和鼠标监点击
Jul 20 Javascript
基于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
20个2014年最优秀的PHP框架回顾
2014/10/22 PHP
PHP实现将多个文件中的内容合并为新文件的方法示例
2017/06/10 PHP
Laravel学习教程之路由模块
2017/08/18 PHP
PHP parse_ini_file函数的应用与扩展操作示例
2019/01/07 PHP
php5.3/5.4/5.5/5.6/7常见新增特性汇总整理
2020/02/27 PHP
定义JavaScript二维数组采用定义数组的数组来实现
2012/12/09 Javascript
window.open的页面如何刷新(父页面)上层页面
2012/12/28 Javascript
使用Post提交时须将空格转换成加号的解释
2013/01/14 Javascript
jQuery点击tr实现checkbox选中的方法
2013/03/19 Javascript
深入剖析JavaScript面向对象编程
2016/07/12 Javascript
JQuery控制DIV的选取实现方法
2016/09/18 Javascript
angularJS Provider、factory、service详解及实例代码
2016/09/21 Javascript
jQuery autoComplete插件两种使用方式及动态改变参数值的方法详解
2016/10/24 Javascript
canvas实现钟表效果
2017/02/13 Javascript
javascript 判断当前浏览器版本并判断ie版本
2017/02/17 Javascript
vue-router 实现导航守卫(路由卫士)的实例代码
2018/09/02 Javascript
使用electron实现百度网盘悬浮窗口功能的示例代码
2018/10/24 Javascript
vue中v-show和v-if的异同及v-show用法
2019/06/06 Javascript
多个vue子路由文件自动化合并的方法
2019/09/03 Javascript
原生JavaScript实现购物车
2021/01/10 Javascript
使用python获取CPU和内存信息的思路与实现(linux系统)
2014/01/03 Python
python实现DNS正向查询、反向查询的例子
2014/04/25 Python
Django REST框架创建一个简单的Api实例讲解
2019/11/05 Python
pytorch 实现删除tensor中的指定行列
2020/01/13 Python
Keras预训练的ImageNet模型实现分类操作
2020/07/07 Python
python virtualenv虚拟环境配置与使用教程详解
2020/07/13 Python
基于python实现MQTT发布订阅过程原理解析
2020/07/27 Python
YOINS官网:时尚女装网上购物
2017/03/17 全球购物
具有防紫外线功能的高性能钓鱼服装:Hook&Tackle
2018/08/16 全球购物
澳大利亚最受欢迎的超级商场每日优惠:Catch
2020/11/17 全球购物
解释一下Windows的消息机制
2014/01/30 面试题
我们没有写servlet的构造方法,那么容器是怎么创建servlet的实例呢
2013/04/24 面试题
计算机求职信
2013/12/01 职场文书
军训 自我鉴定
2014/02/03 职场文书
2015年教师新年寄语
2014/12/08 职场文书
2019思想汇报范文
2019/05/21 职场文书