首先,arguments对象是所有(非箭头)函数中都可用的局部变量。你可以使用arguments对象在函数中引用函数的参数。此对象包含传递给函数的每个参数,第一个参数在索引0处。

arguments对象不是一个 Array 。它类似于Array,但除了length属性和索引元素之外没有任何Array属性。但是它可以被转换为一个真正的Array,

以下为四种方式:已验证

var args = Array.prototype.slice.call(arguments);
var args = [].slice.call(arguments); // ES2015
const args = Array.from(arguments);
const args = [...arguments];

1,非严格模式下,arguments与调用函数时传入的参数一一对应,不管是否有命名参数,

  不存在命名参数时,参数只能通过arguments[i]调用;

  存在命名参数时,参数可以通过arguments[i]或者参数名进行调用,映射关系,修改一个另一个也有变化(前提是命名参数与传入的参数数量相同,否则请看第二点)

  无命名参数时:

console.log('---------------------使用arguments参数对所有函数执行操作------------------------');
//完全没有任何显式定义参数的函数
//迭代所有传入参数,然后通过索引标记获取每个元素的值
function sum() {
var sum = 0;
for (var i = 0; i < arguments.length; i++) {
sum += arguments[i];
}
return sum;
}
//调用函数并传入任意数量的参数
if (sum(1, 2) === 3) {
console.log("We can add two numbers.");
}
if (sum(1, 2, 3) === 6) {
console.log("We can add three numbers");
}
if (sum(1, 2, 3, 4) === 10) {
console.log('We can add four numbers.');
}

  存在命名参数时:

console.log('-------------argument对象作为函数参数的别名----------------------');
//argument参数有一个有趣的特性:它可以作为函数参数的别名。例如,如果为arguments[0]赋一个新值,那么,同时也会改变第一个参数的值。
//检查person参数的值等于gardener,并作为第一个参数被传入。
function infiltrate(person) {
if (person === 'gardener') {
console.log("The person is a gardener.");
} if (arguments[0] === 'gardener') {
console.log('The first argument is a gardener');
} arguments[0] = 'ninja';
//改变argument对象的值也会改变相应的形参
if (person === 'ninja') {
console.log('The person is a ninja now.');
}
if (arguments[0] === 'ninja') {
console.log('The first argument is a ninja.');
} person = 'gardener'; //这两种方式下,别名都正常工作了。
if (person === 'gardener') {
console.log('The person is a gardener once more.');
}
if (arguments[0] === 'gardener') {
console.log('The first argument is a gardener again.');
} } infiltrate("gardener");

2,非严格模式下arguments的length属性在调用函数完成后不可改变:

  2.1通过arguments[i]添加新的属性也不客改变length属性

  2.2通过arguments[i]添加的新属性可以通过arguments[i]访问到

  2.3若传入参数少于定义参数那么在函数内部对定义参数赋值,新参数不可以通过arguments[i]访问到,且不客改变length属性(函数的定义参数是函数内部作用域的已定义变量,与在函数内部定义的变量没有不同)

  综上所述,若传入参数不等于定义参数,那么多出的定义参数或者arguments则失去映射关系,如下所示:

  

        function a(a,b,c){
arguments[2] = 10
console.log(arguments[2],c,arguments.length)
} a(1,2,4) a(5,6)

    function a(a,b,c){
c = 10
console.log(arguments[2],c,arguments.length)
} a(1,2,4) a(5,6)

3,将arguments对象作为函数参数的别名使用时会影响代码的可读性,因此在JavaScript提供的严格模式中(strict mode)中将无法再使用它。arguments对象将不再作为参数的别名

<script type="text/javascript">
"use strict";
console.log('--------使用严格模式避免使用arguments别名---------------');
function infiltrate(person) {
if (person === 'gardener') {
console.log("The person is a gardener.");
} if (arguments[0] === 'gardener') {
console.log('The first argument is a gardener');
}
//改变第一个参数
arguments[0] = 'ninja';
//Person的参数值没有改变
if (person === 'ninja') {
console.log('The person is a ninja now.');
}
//第一个参数值被改变了
if (arguments[0] === 'ninja') {
console.log('The first argument is a ninja.');
}
}
infiltrate('gardener');
</script>

第一行代码use strict是一个简单的字符串,这将告诉JavaScript引擎,我们希望将下面的代码在严格模式下执行。严格模式将改变程序的执行结果,最终person参数的值和arguments参数的第一个中将不再相同。

//改变第一个参数

arguments[0] = 'ninja';

//Person的参数值没有改变

if (person === 'ninja') {

console.log('The person is a ninja now.');

}

//第一个参数值被改变了

if (arguments[0] === 'ninja') {

console.log('The first argument is a ninja.');

}

但与非严格模式不同的是,这一次arguments对象将不再作为参数的别名。如果想通过arguments[0]='ninja'改变第一个参数的值,这将不会改变person参数。

参考:javascript 理解函数调用-操作arguments参数 https://blog.csdn.net/zhangying1994/article/details/86529770

  理解函数参数及arguments https://www.jianshu.com/p/75f8fa2ad073

  JS中的arguments参数 https://blog.csdn.net/zjy_android_blog/article/details/80934042

  Arguments 对象 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Functions/arguments

arguments详解——函数内命名参数之映射的更多相关文章

  1. JavaScript中的arguments详解

    1. arguments arguments不是真正的数组,它是一个实参对象,每个实参对象都包含以数字为索引的一组元素以及length属性. (function () { console.log(ar ...

  2. JavaScript学习总结(三、函数声明和表达式、this、闭包和引用、arguments对象、函数间传递参数)

    一.函数声明和表达式 函数声明: function test() {}; test();    //运行正常 function test() {}; 函数表达式: var test = functio ...

  3. Mysql常用show命令,show variables like xxx 详解,mysql运行时参数

    MySQL中有很多的基本命令,show命令也是其中之一,在很多使用者中对show命令的使用还容易产生混淆,本文汇集了show命令的众多用法. 详细: http://dev.mysql.com/doc/ ...

  4. Python趣味入门9:函数是你走过的套路,详解函数、调用、参数及返回值

    1.概念 琼恩·雪诺当上守夜人的司令后,为训练士兵对付僵尸兵团,把成功斩杀僵尸的一系列动作编排成了"葵花宝典剑法",这就是函数.相似,在计算机世界,一系列前后连续的计算机语句组合在 ...

  5. 【WebApi系列】详解WebApi如何传递参数

    WebApi系列文章 [01]浅谈HTTP在WebApi开发中的运用 [02]聊聊WebApi体系结构 [03]详解WebApi参数的传递 [04]详解WebApi测试和PostMan [05]浅谈W ...

  6. 第4天:function对象(案例:获取当前日期属于当年第几天、arguments对象、函数类型、参数、返回值、自身调用)

    获取当前日期输入当年第几天 //输入,年月日,获取这个日期是这一年的第几天 //年-月--日:20171月31日 function getDay(year,month,day){ //定义变量存储对应 ...

  7. js中arguments详解

    在js中一切都是对象,连函数也是对象,函数名其实是引用函数定义对象的变量. 什么是arguments? 这个函数体内的arguments非常特殊,实际上是所在函数的一个内置类数组对象,可以用数组的[i ...

  8. 详解Linux内核红黑树算法的实现

    转自:https://blog.csdn.net/npy_lp/article/details/7420689 内核源码:linux-2.6.38.8.tar.bz2 关于二叉查找树的概念请参考博文& ...

  9. arguments详解

    arguments 是什么? 是一个对象,一个 很像数组的对象 arguments内容是什么? 1是函数运行时的实参列表 2收到实参收集起来,放到一个arguments对象里 在词法分析中,首先按形参 ...

随机推荐

  1. 项目中使用vue的API。 和项目的结构

    <template> <!--组件的 结构--> <div id="app"> <h3>{{ msg }}</h3> & ...

  2. 快速安装create-react-app脚手架

    create-react-app搭建react项目:https://blog.csdn.net/weixin_41077029/article/details/82622106 快速安装create- ...

  3. 【6.12校内test】T3 城市交通费

    要不我先去写T2吧(逃 先把题目搞上来: [问题描述] 有 n 个城市,编号 1~n.其中 i 号城市的繁华度为 pi.省内有 m 条可以双向同行的高速 公路,编号 1~m.编号为 j 的高速公路连接 ...

  4. Python Set intersection() 方法

    描述 intersection() 方法用于返回两个或更多集合中都包含的元素,即交集. 语法 intersection() 方法语法: set.intersection(set1, set2 ... ...

  5. cs244a-Introduction to Computer Networking-Unit2

    Unit2: Transport 学习目标: how TCP set up a connection what TCP segment looks like how can TCP be in hig ...

  6. php开发环境推荐使用

    万丈高楼平地起,好用得环境才能建立宏伟大厦,php开发环境推荐使用 1,自己安装 lamp 环境 linux+apache+mysql+php 2,自己安装 lnmp 环境 linux+nginx+m ...

  7. Java学习路线(完整详细版)

    Java学习路线(完整详细版) https://jingyan.baidu.com/article/c1a3101e110864de656deb83.html

  8. JVM内存分配和垃圾回收以及性能调优

    JVM内存分配策略 一:堆中优先分配Eden 大多数情况下,对象都在新生代的Eden区中分配内存.而新生代会频繁进行垃圾回收. 二:大对象直接进入老年代 需要大量连续空间的对象,如:长字符串.数组等, ...

  9. ——HTTP状态码

    200 请求成功,请求所希望的响应头或数据体将随此返回 302 请求的资源现在临时从不同的URI响应请求,由于这样的重定向是临时的,客户端应当继续向原有地址发送以后的请求. 304 如果客户端发送了一 ...

  10. 2018牛客网暑期ACM多校训练营(第十场)A Rikka with Lowbit (树状数组)

    链接:https://ac.nowcoder.com/acm/contest/148/A 来源:牛客网 Rikka with Lowbit 时间限制:C/C++ 5秒,其他语言10秒 空间限制:C/C ...