js中arguments对象的深入理解


Posted in Javascript onMay 14, 2019

前言

在JavaScript中,arguments属于当前对象的一个内置属性,arguments非常类似于Array对象,但是又不是实例的Array。本文主要给大家介绍了关于js中arguments对象的相关内容,下面话不多说了,来一起看看详细的介绍吧

一、在函数调用的时候,浏览器每次都会传递进两个隐式参数

  • 函数的上下文对象this
  • 封装实参的对象arguments

二、arguments 对象

  • arguments 对象实际上是所在函数的一个内置类数组对象
  • 每个函数都有一个arguments属性,表示函数的实参集合,这里的实参是重点,就是执行函数时实际传入的参数的集合。arguments不是数组而是一个对象,但它和数组很相似,所以通常称为类数组对象,以后看到类数组其实就表示arguments。arguments对象不能显式的创建,它只有在函数开始时才可用。
  • arguments还有属性callee,length和迭代器Symbol。
  • arguments同样具有length属性,arguments.length 为函数实参个数,可以用arguments[length]显示调用参数
  • arguments对象可以检测参数个数,模拟函数重载

三、理解点

第一点:arguments对象:可以在函数内访问所有的参数,实参

    实例代码:

function f1(){
  console.log(arguments[0]);
  console.log(arguments[1]);
  console.log(arguments[2]);
 }

 f1(12,23,45); //12 34 45

第二点:在正常的模式下,arguments对象可以在运行的时候进行修改

    实例代码:

function f2(a,b){
  arguments[0] = 10;
  arguments[1] = 20;
  return a + b;
 }

 console.log(f2(4,6)); //30

第三点:在严格的模式下,arguments对象在运行的时候不可以修改,修改arguments对象不会影响到实际的函数参数

    注意:  'use strict' 是开启严格模式

    实例代码:

function f3(a,b){
  'use strict';
  arguments[0] = 10;
  arguments[1] = 20;
  return a + b;
 }

 console.log(f3(3,6)); //9

第四点:通过arguments对象的length属性,可以判断实参的个数

    实例代码:

function f4(){
  console.log(arguments.length);
 }

 f4(2,3,4,5); //4
 f4(1);  //1
 f4();  //0

第五点:arguments是一个对象,不是数组,转换为数组可以采用 slice 和 逐一填入新数组

    实例代码:

var arr = Array.prototype.slice.call(arguments);
  console.log(typeof arr);

  var arr2 = [];
  for(var i = 0; i<arguments.length;i++){
   arr2.push(arguments[i]);
  }
  console.log(typeof arr2);

第六点:arguments的callee属性可以返回对应的原函数,达到调用自身函数的效果,但是在严格模式中是不适用的

    实例代码:

var f5 = function(){
   console.log(arguments.callee===f5); //true
   console.log(arguments.callee===f6); //false
  }
  
  var f6;
  f5(); //返回原函数,调用自身

四、arguments的应用

第一点:arguments.callee为引用函数自身。我们可以借用arguments.length可以来查看实参和形参的个数是否一致

    实例代码:

function add(a, b) { 

 var realLen = arguments.length; 
 console.log("realLen:", arguments.length); 
 var len = add.length; 
 console.log("len:", add.length); 

 if (realLen == len) { 
 console.log('实参和形参个数一致'); 
 } else { 
 console.log('实参和形参个数不一致'); 
 } 

}; 

add(11,22,33,44,66);

第二点:我们可以借用arguments.callee来让匿名函数实现递归

    实例代码:

var sum = function(n) { 

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

console.log("sum =", sum(5));

第三点:编写一个函数求传入的若干个数字(不能用数组显示传入)的和

    实例代码:

function add() { 

var len = arguments.length; 
var sum = 0; 

for (var i = 0; i < len; ++i) { 
  sum += arguments[i]; 
} 
return sum; 
}; 

add(11,22,33,44,66);

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
兼容多浏览器的字幕特效Marquee的通用js类
Jul 20 Javascript
JQERY limittext 插件0.2版(长内容限制显示)
Aug 27 Javascript
jquery的键盘事件修改代码
Feb 24 Javascript
javascript新建标签,判断键盘输入,以及判断焦点(示例代码)
Nov 25 Javascript
jquery Tab效果和动态加载的简单实例
Dec 11 Javascript
js中同步与异步处理的方法和区别总结
Dec 25 Javascript
jquery插件jSignature实现手动签名
May 04 Javascript
javascript实现图片跟随鼠标移动效果的方法
May 13 Javascript
详解JavaScript中基于原型prototype的继承特性
May 05 Javascript
JS实现可切换图片的幻灯切换效果示例
May 24 Javascript
js中值引用和地址引用实例分析
Jun 21 Javascript
vue中实现弹出层动画效果的示例代码
Sep 25 Javascript
ios中视频的最后一桢问题解决
May 14 #Javascript
详解可以用在VS Code中的正则表达式小技巧
May 14 #Javascript
vue项目中引入vue-datepicker插件的详解
May 14 #Javascript
JQuery获取可视区尺寸和文档尺寸及制作悬浮菜单示例
May 14 #jQuery
JavaScript中this的全面解析及常见实例
May 14 #Javascript
jquery 验证用户名是否重复代码实例
May 14 #jQuery
记录vue项目中遇到的一点小问题
May 14 #Javascript
You might like
数据库的日期格式转换
2006/10/09 PHP
CodeIgniter集成smarty的方法详解
2016/05/26 PHP
php编译安装php-amq扩展简明教程
2016/06/25 PHP
php使用json_decode后数字对象转换成了科学计数法的解决方法
2017/02/20 PHP
passwordStrength 基于jquery的密码强度检测代码使用介绍
2011/10/08 Javascript
js遍历td tr等html元素
2012/12/13 Javascript
《JavaScript DOM 编程艺术》读书笔记之JavaScript 语法
2015/01/09 Javascript
详解JavaScript对Date对象的操作问题(生成一个倒数7天的数组)
2015/10/01 Javascript
所见即所得的富文本编辑器bootstrap-wysiwyg使用方法详解
2016/05/27 Javascript
JS新包管理工具yarn和npm的对比与使用入门
2016/12/09 Javascript
浅谈react.js 之 批量添加与删除功能
2017/04/17 Javascript
JS原生带小白点轮播图实例讲解
2017/07/22 Javascript
vue基于mint-ui实现城市选择三级联动
2020/06/30 Javascript
vue实现底部菜单功能
2018/07/24 Javascript
[20:46]Ti4循环赛第三日VG vs DK
2014/07/12 DOTA
以一个投票程序的实例来讲解Python的Django框架使用
2016/02/18 Python
python中的字典使用分享
2016/07/31 Python
Python制作简易注册登录系统
2016/12/15 Python
Python解决N阶台阶走法问题的方法分析
2017/12/28 Python
Python中文编码知识点
2019/02/18 Python
Django学习之文件上传与下载
2019/10/06 Python
使用tensorflow DataSet实现高效加载变长文本输入
2020/01/20 Python
HTML5 创建canvas元素示例代码
2014/06/04 HTML / CSS
复古斯堪的纳维亚儿童服装:Baby go Retro
2017/09/09 全球购物
Under Armour安德玛英国官网:美国高端运动科技品牌
2018/09/17 全球购物
世界上最好的足球商店:Unisport
2019/03/02 全球购物
幼儿园毕业园长感言
2014/02/24 职场文书
三八妇女节标语
2014/10/09 职场文书
学习保证书怎么写
2015/02/26 职场文书
就业证明函
2015/06/17 职场文书
Python爬虫入门案例之回车桌面壁纸网美女图片采集
2021/10/16 Python
【海涛教你打DOTA】剑圣第一人称视角解说
2022/04/01 DOTA
centos7安装mysql5.7经验记录
2022/05/02 Servers
MySQL数据库 安全管理
2022/05/06 MySQL
MySQL数据库如何查看表占用空间大小
2022/06/10 MySQL
js面向对象编程OOP及函数式编程FP区别
2022/07/07 Javascript