JavaScript中的arguments详解
1. arguments
arguments不是真正的数组,它是一个实参对象,每个实参对象都包含以数字为索引的一组元素以及length属性。
(function () {
console.log(arguments instanceof Array); // false
console.log(typeof (arguments)); // object
})();
只有函数被调用时,arguments对象才会创建,未调用时其值为null
console.log(new Function().arguments); // null
JavaScript函数调用不对参数做任何检查。
当调用函数的时候传入的实参比形参个数少时,剩下的形参都被设置为undefined。
给被省略的参数赋值:
function getPropertyNames(o, /* optional */ a) {
a = a || []; // 等于 if(a == undefined) a = [];
for (var property in o) {
a.push(property);
}
return a;
}
console.log(getPropertyNames({ '1': 'a', '2': 'b' })); // ["1", "2"]
console.log(getPropertyNames({ '1': 'a', '2': 'b' }, ['3'])); // ["3", "1", "2"]
- 当调用函数传入的参数比形参个数多时,通过标识符arguments可以获得未命名的引用。
验证实参的个数
function f(x, y, z) {
// 首先,验证传入实参的个数是否正确
if (arguments.length != 3) {
throw new Error("function f called with " + arguments.length + "arguments, but it expects 3 arguments.");
}
// 再执行函数的其他逻辑
}
f(1, 2); // Uncaught Error: function f called with 2arguments, but it expects 3 arguments.
查看实参和形参的个数是否一致
// 查看实参和形参的个数是否一致
function add(a, b) {
var realLen = arguments.length;
console.log("realLen:", arguments.length); // realLen: 5
var len = add.length;
console.log("len:", add.length); // len: 2
if (realLen == len) {
console.log('实参和形参个数一致');
} else {
console.log('实参和形参个数不一致');
}
};
add(1, 2, 3, 6, 8);
模拟函数重载
function doAdd() {
if (arguments.length == 1) {
console.log(arguments[0] + 5);
} else if (arguments.length == 2) {
console.log(arguments[0] + arguments[1]);
}
}
接受任意数量的实参,并返回其中的最大值
function max(/* ... */) {
var max = Number.NEGATIVE_INFINITY;
// 遍历实参,查找并记住最大值
for (var i = 0; i < arguments.length; i++) {
if (arguments[i] > max) {
max = arguments[i];
}
}
// 返回最大值
return max;
}
console.log(max(1, 10, 110, 2, 3, 5, 10000, 100)); // 10000
自动更新
function f(x) {
console.log(x); // 1,输出实参的初始值
arguments[0] = null; // 修改实参数组的元素同样会修改x的值
console.log(x); // null
x = 'a'; // 修改x的值同样会修改实参数组的元素
console.log(arguments[0]); // a
}
f(1);
- 实参对象定义了callee和caller属性,callee属性指代正在执行的函数,caller指代调用当前正在执行的函数的函数
- arguments 的完整语法如下:
[function.]arguments[n]
function :当前正在执行的 Function 对象的名字。
n :要传递给 Function 对象的从0开始的参数值索引。
查看callee和caller属性
function a() {
console.log('a...');
b();
}
function b() {
console.log('b...');
console.log(b.arguments.callee);
console.log(b.caller);
}
a();
通过callee实现递归调用自身
var factorial = function (x) {
if (x <= 1) { return 1; }
return x * arguments.callee(x - 1);
}
console.log(factorial(5)); // 120
参考资料
- 《JavaScript权威指南》第六版
- JavaScript 之arguments、caller 和 callee 介绍
- js之arguments详解
JavaScript中的arguments详解的更多相关文章
- JavaScript正则表达式详解(二)JavaScript中正则表达式函数详解
二.JavaScript中正则表达式函数详解(exec, test, match, replace, search, split) 1.使用正则表达式的方法去匹配查找字符串 1.1. exec方法详解 ...
- (转)javascript中event对象详解
原文:http://jiajiale.iteye.com/blog/195906 javascript中event对象详解 博客分类: javaScript JavaScriptCS ...
- 【JavaScript中的this详解】
前言 this用法说难不难,有时候函数调用时,往往会搞不清楚this指向谁?那么,关于this的用法,你知道多少呢? 下面我来给大家整理一下关于this的详细分析,希望对大家有所帮助! this指向的 ...
- JavaScript中的this详解
前言 this用法说难不难,有时候函数调用时,往往会搞不清楚this指向谁?那么,关于this的用法,你知道多少呢? 下面我来给大家整理一下关于this的详细分析,希望对大家有所帮助! this指向的 ...
- Javascript中prototype属性详解 (存)
Javascript中prototype属性详解 在典型的面向对象的语言中,如java,都存在类(class)的概念,类就是对象的模板,对象就是类的实例.但是在Javascript语言体系中,是不 ...
- JavaScript 中 this 的详解
this 的指向 this 是 js 中定义的关键字,它自动定义于每一个函数域内,但是它的指向却让人很迷惑.在实际应用中,this 的指向大致可以分为以下四种情况. 原文作者:林鑫,作者博客:http ...
- javascript中的操作符详解1
好久没有写点什么了,根据博主的技术,仍然写一点javascript新手入门文章,接下来我们一起来探讨javascript的操作符. 一.前言 javascript中有许多操作符,但是许多初学者并不理解 ...
- Javascript中prototype属性详解
在典型的面向对象的语言中,如java,都存在类(class)的概念,类就是对象的模板,对象就是类的实例.但是在Javascript语言体系中,是不存在类(Class)的概念的,javascript中不 ...
- [No000069]Javascript中this关键字详解
Quiz 请看下面的代码,最后alert出来的是什么呢?(chrome下按F12,选择Console直接复制粘贴运行) var name = "Bob"; var nameObj ...
随机推荐
- 07慕课网《进击Node.js基础(一)》HTTP小爬虫
获取HTML页面 var http = require('http') var url='http://www.imooc.com/learn/348' http.get(url,function(r ...
- 软工实践-Beta 冲刺 (4/7)
队名:起床一起肝活队 组长博客:博客链接 作业博客:班级博客本次作业的链接 组员情况 组员1(队长):白晨曦 过去两天完成了哪些任务 描述: 1.界面的修改与完善 展示GitHub当日代码/文档签入记 ...
- 剑指offer :从尾到头打印链表
题目描述: 输入一个链表,按链表值从尾到头的顺序返回一个ArrayList. 解题思路: 链表的遍历只能从头向尾进行,要从尾到头输出,考虑用栈.先从头到尾遍历一次链表,同时将值进栈,再清空栈,同时将值 ...
- git学习(一) 如何将项目上传到github
用了github有了段时间,但是感觉都是断断续续的,这次花了点时间来总结下,已方便下次忘记的时候拿出来看一下: 自己主要是参考了这个网站来学习的: git教程 -廖雪峰 第一步: 创建github账号 ...
- Week3结对项目-数独游戏
题目要求 1)在文章开头给出Github项目地址.(1') 2)在开始实现程序之前,在下述PSP表格记录下你估计将在程序的各个模块的开发上耗费的时间.(0.5') 3)看教科书和其它资料中关于Info ...
- Java中的多线程科普
如果对什么是线程.什么是进程仍存有疑惑,请先Google之,因为这两个概念不在本文的范围之内. 用多线程只有一个目的,那就是更好的利用cpu的资源,因为所有的多线程代码都可以用单线程来实现.说这个话其 ...
- macOS how to install python3
macOS how to install python3 macOS & Python 3.7.2 https://www.python.org/downloads/mac-osx/ http ...
- [BinaryTree] AVL树、红黑树、B/B+树和Trie树的比较
转自:AVL树.红黑树.B/B+树和Trie树的比较 AVL树 最早的平衡二叉树之一.AVL是一种高度平衡的二叉树,所以通常的结果是,维护这种高度平衡所付出的代价比从中获得的效率收益还大,故而实际的应 ...
- YARN的重启动问题:RM Restart/RM HA/Timeline Server/NM Restart
ResourceManger Restart ResourceManager负责资源管理和应用的调度,是YARN的核心组件,有可能存在单点失败的问题.ResourceManager Restart是使 ...
- NOIP2017 心路历程
虽然没能去考试,但是在学弟们考试前后也发生了很多事情. 周四晚上.学弟们出发前最后一天.单独找几个人谈了谈.面对退役他们还是有点慌啊.这个时候给他们调整心态或许有点迟了. 21:45.最后一分钟.为他 ...