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中的arguments详解的更多相关文章

  1. JavaScript正则表达式详解(二)JavaScript中正则表达式函数详解

    二.JavaScript中正则表达式函数详解(exec, test, match, replace, search, split) 1.使用正则表达式的方法去匹配查找字符串 1.1. exec方法详解 ...

  2. (转)javascript中event对象详解

    原文:http://jiajiale.iteye.com/blog/195906 javascript中event对象详解          博客分类: javaScript JavaScriptCS ...

  3. 【JavaScript中的this详解】

    前言 this用法说难不难,有时候函数调用时,往往会搞不清楚this指向谁?那么,关于this的用法,你知道多少呢? 下面我来给大家整理一下关于this的详细分析,希望对大家有所帮助! this指向的 ...

  4. JavaScript中的this详解

    前言 this用法说难不难,有时候函数调用时,往往会搞不清楚this指向谁?那么,关于this的用法,你知道多少呢? 下面我来给大家整理一下关于this的详细分析,希望对大家有所帮助! this指向的 ...

  5. Javascript中prototype属性详解 (存)

    Javascript中prototype属性详解   在典型的面向对象的语言中,如java,都存在类(class)的概念,类就是对象的模板,对象就是类的实例.但是在Javascript语言体系中,是不 ...

  6. JavaScript 中 this 的详解

    this 的指向 this 是 js 中定义的关键字,它自动定义于每一个函数域内,但是它的指向却让人很迷惑.在实际应用中,this 的指向大致可以分为以下四种情况. 原文作者:林鑫,作者博客:http ...

  7. javascript中的操作符详解1

    好久没有写点什么了,根据博主的技术,仍然写一点javascript新手入门文章,接下来我们一起来探讨javascript的操作符. 一.前言 javascript中有许多操作符,但是许多初学者并不理解 ...

  8. Javascript中prototype属性详解

    在典型的面向对象的语言中,如java,都存在类(class)的概念,类就是对象的模板,对象就是类的实例.但是在Javascript语言体系中,是不存在类(Class)的概念的,javascript中不 ...

  9. [No000069]Javascript中this关键字详解

    Quiz 请看下面的代码,最后alert出来的是什么呢?(chrome下按F12,选择Console直接复制粘贴运行) var name = "Bob"; var nameObj ...

随机推荐

  1. 《Java学习笔记JDK8》学习总结

    chapter 6   继承与多态 6.1何谓继承 1.继承的定义:继承就是避免多个类间重复定义共同行为. 2.总结:教材中通过设计一款RPG游戏的部分代码向我们展示了“重复”程序代码的弊端,为了改进 ...

  2. YQCB冲刺周第七天

    站立会议 任务看板 燃尽图 今天的任务为实现个人设置中的修改密码.设置金额的功能.以及界面的美化. 遇到的问题为修改自己密码时获得当前用户的id问题.

  3. bata1

    目录 组员情况 组员1(组长):胡绪佩 组员3:庄卉 组员4:家灿 组员5:凯琳 组员6:翟丹丹 组员7:何家伟 组员8:政演 组员9:黄鸿杰 组员10:刘一好 组员11:何宇恒 展示组内最新成果 团 ...

  4. iOS成长之路-使用系统默认声音、震动

    导入框架 代码片段 apple系统默认声音名称说明: 1.声音格式是MP3或m4r的需要转成caf格式(可先转成aif , aiff,然后修改后缀) 2.路径在/System/Library/Audi ...

  5. 视频剪辑软件-PR (Adobe Premiere)

    1.PR 是什么? Adobe Premiere 是一款常用的视频编辑软件,由Adobe公司推出.PR是一款编辑画面质量较好的软件,有较好的兼容性,且可以与Adobe公司推出的其他软件相互协作.目前这 ...

  6. JavaScript 稀奇的js语法

    function c(expression) { console.log(expression); } c(-0); // -0 c(-0 === +0); // true c((-0).toStri ...

  7. STM32标准外设库、 HAL库、LL库

    工作以来一直使用ST的STM32系列芯片,ST为开发者提供了非常方便的开发库.到目前为止,有标准外设库(STD库).HAL库.LL库 三种.前两者都是常用的库,后面的LL库是ST最近才添加,目前支持的 ...

  8. 基本数据类型用== 比较数值 引用类型用==比较的是jvm中的地址 比较数值用equal

    基本数据类型用== 比较数值     引用类型用==比较的是jvm中的地址 比较数值用equal

  9. 适用于Rick的奖惩体系

    适用于Rick的奖惩体系 虽然对于时间有了更加清晰的认知,但是在时间管理方面还是不够严格,源于对自身的放松要求以及不够自律.第二个是周期性的思想松懈,比如周五了,想着马上周末了. 今天中午洗碗的时候, ...

  10. IBatisNet 缓存使用

    参考:http://www.cnblogs.com/xiaogangqq123/archive/2011/06/30/2094905.html <?xml version="1.0&q ...