arguments对象详解
在javascript中,函数是没有重载这一项的,所谓的重载,一个函数可以有多个,就是参数的个数和形式不同所以引用的功能不同,而js不存在函数重载,不管传不传参数,函数里面是否引用,关系都不大,一个函数对应一个功能,但是函数可以模拟函数重载,所以有一个Arguments对象。
定义
arguments是一个对应于传递给函数的参数的类数组对象。
类数组:是数组的形式,有length,但不具有数组的一切方法。
描述
arguments对象是所有(非箭头)函数中都可用的局部变量。你可以使用arguments对象在函数中引用函数的参数。此对象包含传递给函数的每个参数,第一个参数在索引0处。
箭头函数没有arguments对象
arguments是函数中必有的对象,用来读取调用该函数的参数
function foo(){
console.log(arguments[0]) // 1
console.log(arguments[1]) // 2
console.log(arguments[2]) // 3
}
foo(1,2,3)
arguments对象不是数组,但可以通过其他方式转化为数组,进而使用数组的方法。
var args = Array.prototype.slice.call(arguments)
var args = [].slice.call(arguments);
var args = Array.from(arguments)
var args = [...arguments]
function foo() {
var f = Array.prototype.slice.call(arguments);
// var f = [].slice.call(arguments);
// var f = Array.from(arguments);
// var f = [...arguments];
console.log(f) // [1,2,3]
console.log(f instanceof Array) // true
}
foo(1, 2, 3)
属性
arguments既然是个对象,也有它的自带的属性。
- length 长度,本次函数调用时传入函数的实参数量.
- 表示的是实际上向函数传入了多少个参数,这个数字可以比形参数量大,也可以比形参数量小
- 形参:全称“形参变量”,只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只在函数内部有效。函数调用结束返回主调用函数后则不能再使用该形参变量。
- 实参:全称为"实际参数"是在调用时传递给函数的参数. 实参可以是常量、变量、表达式、函数等, 无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值, 以便把这些值传送给形参。 因此应预先用赋值,输入等办法使实参获得确定值。
形参就是函数声明的参数,实参是函数调用的参数
function foo(a,b){} // a,b代表形参
foo(1,2) // 1,2代表实参
- callee 当前正在执行的函数
- 可以用于引用该函数的函数体内当前正在执行的函数(类似于递归)
- es5之后废弃,但不代表不使用这个callee了
- callee可以使用在匿名递归函数中。
- 匿名函数 (通过 函数表达式 或者 函数构造器 创建) 没有名称。因此如果没有可访问的变量指向该函数,唯一能引用它的方式就是通过 arguments.callee。
function create() {
return function (n) {
if (n <= 1)
return 1;
return n * arguments.callee(n - 1);
};
} var result = create()(5);
console.log(result) // returns 120 (5 * 4 * 3 * 2 * 1)
- 但不提倡使用callee来递归,最好形成有名函数,进而使用函数名递归。
function create() {
return function multiply(n) {
if (n <= 1)
return 1;
return n * multiply(n - 1);
};
} var result = create()(5);
console.log(result) // returns 120 (5 * 4 * 3 * 2 * 1)
- caller 指向调用当前函数的函数
- 原先用在函数执行的时候调用自身
- 已废弃,不能用
- arguments[@@iterator] 返回一个新的Array迭代器对象,该对象包含参数中每个索引的值。
- 这个意思就是可以调用for-of循环 - -!
function add(){
for(var i of arguments){
console.log(i) //1 2 3 4 5 6
}
}
add(1,2,3,4,5,6)
特殊点
当arguments遇到剩余函数,解构赋值和默认参数的情况:
- 在严格模式下,剩余参数、默认参数和解构赋值参数的存在不会改变 arguments对象的行为,
"use strict"
function func(...a) {
a[0] = 11
console.log(arguments);
}
func(1,2,3,4,5); // [1,2,3,4,5]
function func1(a=4) {
console.log(arguments);
}
func1(1); // [1]
- 当非严格模式中的函数没有包含剩余参数、默认参数和解构赋值,那么arguments对象中的值会跟踪参数的值(反之亦然)
function func(a) {
arguments[0] = 99; // 更新了arguments[0] 同样更新了a
console.log(a);
}
func(10); // 99
function func1(a) {
a = 99; // 更新了a 同样更新了arguments[0]
console.log(arguments[0]);
}
func1(10); // 99
- 当非严格模式中的函数有包含剩余参数、默认参数和解构赋值,那么arguments对象中的值不会跟踪参数的值(反之亦然)
function func(a = 55) {
arguments[0] = 99; // 更新了 arguments[0] 但没更新 a
console.log(a);
}
func(10); // 10
function func1(a = 55) {
a = 99; // 更新了 a 但没更新arguments[0]
console.log(arguments[0]);
}
func1(10); // 10
function func2(a = 55) {
console.log(arguments[0]);
}
func2(); // undefined
总结
前段时间看到arguments对象,不是很懂,所以抽空学习了一下。es6箭头函数的出现,arguments对象相对来说少用了,因为箭头函数没有arguments对象。再加上有一些属性都被遗弃。但是不能不学,所有的知识都是从底层创建出来的,了解底层知识是有好处的。
如果此文有什么不对的地方,欢迎评论私信,大家一起进步。我把我总结的知识点放到GitHub了,如果满意,给个star。
参考文献
MDN https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Functions/arguments
arguments对象详解的更多相关文章
- JavaScript arguments对象详解
1. 什么是 arguments MDN 上解释: arguments 是一个类数组对象.代表传给一个function的参数列表. 我们先用一个例子直观了解下 JavaScript 中的 argume ...
- js对象详解(JavaScript对象深度剖析,深度理解js对象)
js对象详解(JavaScript对象深度剖析,深度理解js对象) 这算是酝酿很久的一篇文章了. JavaScript作为一个基于对象(没有类的概念)的语言,从入门到精通到放弃一直会被对象这个问题围绕 ...
- JS变量对象详解
JS变量对象详解 开年之后工作热情一直不是很高,这几天一直处于消极怠工状态.早上不想起床,起床了不想上班.明明放假之前工作热情还一直很高,一直心心念念的想把小程序项目怼出来,结果休假回来之后画风完全不 ...
- JavaScript进阶知识点——函数和对象详解
JavaScript进阶知识点--函数和对象详解 我们在上期内容中学习了JavaScript的基本知识点,今天让我们更加深入地了解JavaScript JavaScript函数 JavaScript函 ...
- jQuery的deferred对象详解
jQuery的deferred对象详解请猛击下面的链接 http://www.ruanyifeng.com/blog/2011/08/a_detailed_explanation_of_jquery_ ...
- Window 对象详解 转自 http://blog.csdn.net/jcx5083761/article/details/41243697
详解HTML中的window对象和document对象 标签: HTMLwindowdocument 2014-11-18 11:03 5884人阅读 评论(0) 收藏 举报 分类: HTML& ...
- jQuery的deferred对象详解(转载)
本文转载自: jQuery的deferred对象详解(转载)
- mvc-servlet---ServletConfig与ServletContext对象详解(转载)
ServletConfig与ServletContext对象详解 一.ServletConfig对象 在Servlet的配置文件中,可以使用一个或多个<init-param>标签为s ...
- JS中的event 对象详解
JS中的event 对象详解 JS的event对象 Event属性和方法:1. type:事件的类型,如onlick中的click:2. srcElement/target:事件源,就是发生事件的 ...
随机推荐
- admin-handlers.go
package],,) ],,) ],,) ],,) ],,) ]) if err == redis.Nil { http.NotFound(w, r) } else ...
- BZOJ_3038_上帝造题的七分钟2_线段树
BZOJ_3038_上帝造题的七分钟2_线段树 题意: XLk觉得<上帝造题的七分钟>不太过瘾,于是有了第二部. "第一分钟,X说,要有数列,于是便给定了一个正整数数列. 第二分 ...
- oracle改造常见问题
一. to_char: 将数值型或者日期型转化为字符型 (string) 日期到字符操作 select to_char(sysdate,'yyyy-MM-dd HH24:mi:ss') from du ...
- 数字类型——python3
今天我为各位小伙伴准备了python3中数字类型,希望能够帮助到你们! Python 数字数据类型用于存储数值. 数据类型是不允许改变的,这就意味着如果改变数字数据类型的值,将重新分配内存空间. 以下 ...
- Exp6 信息搜集与漏洞扫描 20164312 马孝涛
1.实践内容 (1)各种搜索技巧的应用 (2)DNS IP注册信息的查询 (3)基本的扫描技术:主机发现.端口扫描.OS及服务版本探测.具体服务的查点(以自己主机为目标) (4)漏洞扫描:会扫, ...
- img 灰色默认外边框的去除
最近在做一个小游戏时发现了一个问题,总是在弹出img时先出现一个灰色的边框,所以为了查找问题,查找了一些关于img 默认边框的小知识点. 在这里整理了一些知识点: 一. 下面代码都试验过后会发现,im ...
- 距离度量以及python实现(二)
接上一篇:http://www.cnblogs.com/denny402/p/7027954.html 7. 夹角余弦(Cosine) 也可以叫余弦相似度. 几何中夹角余弦可用来衡量两个向量方向的差异 ...
- FreeSql v0.5.x 功能介绍
弱类型 之前在操作实体时,必须传统泛型参数,现在可以实现弱类型实体的操作.以 Repository 为例: var repos = fsql.GetGuidRepository<object&g ...
- 程序员如何巧用Excel提高工作效率 第二篇
之前写了一篇博客程序员如何巧用Excel提高工作效率,讲解了程序员在日常工作中如何利用Excel来提高工作效率,没想到收到很好的反馈,点赞量,评论量以及阅读量一度飙升为我的博客中Top 1,看来大家平 ...
- LeetCode算法题-Jewels and Stones(Java实现)
这是悦乐书的第313次更新,第334篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第182题(顺位题号是771).字符串J代表珠宝,S代表你拥有的石头.S中的每个字符都是 ...