Javascript学习笔记之函数篇(四):arguments 对象


Posted in Javascript onNovember 23, 2014

每一个 Javascript 函数都能在自己作用域内访问一个特殊的变量 - arguments。这个变量含有一个传递给函数的所有参数的列表。
arguments 对象不是一个数组。尽管在语法上它跟数组有相同的地方,例如它拥有 length 属性。但它并不是从 Array.prototype 继承而来,实际上,它就是一个对象。
因此,我们不能直接对 arguments 使用一些数组的方法,例如 push, pop 或 slice 等。 所以为了使用这些方法,我们就需要将其转换为一个真正的数组。

转化为数组

下面的代码将会返回一个包含 arguments 对象所有元素的数组。

Array.prototype.slice.call(arguments);
由于转化的速度很慢,所以在性能要求严格的程序中不建议这样做。

传递参数

下面是一种比较推荐的方法,将 arguments 对象从一个函数传递到另一个函数。

function foo() {

    bar.apply(null, arguments);

}

function bar(a, b, c) {

    // do stuff here

}

另外还有一个比较巧妙的方法,就是同时使用 call 和 apply 快速创建一个解绑的外层方法。

function Foo() {}

Foo.prototype.method = function(a, b, c) {

    console.log(this, a, b, c);

};

// Create an unbound version of "method" 

// It takes the parameters: this, arg1, arg2...argN

Foo.method = function() {

    // Result: Foo.prototype.method.call(this, arg1, arg2... argN)

    Function.call.apply(Foo.prototype.method, arguments);

};

函数形参和 arguments 属性的关系

arguments 对象为它自身属性和函数的形参都创建了 getter 和 setter 方法。
因此,修改函数的形参会影响对应的 arguments 对象的属性值,反之亦然。

function foo(a, b, c) {

    arguments[0] = 2;

    a; // 2

    b = 4;

    arguments[1]; // 4

    var d = c;

    d = 9;

    c; // 3

}

foo(1, 2, 3);

性能问题

arguments 只在两种情况下不会被创建,一是在函数内部被声明为局部变量,二是当做函数的形参。其他情况,arguments 对象总是会被创建。
由于 getter 和 setter 方法总是会随着 arguments 对象的创建而创建,因此使用 arguments 对性能本身几乎没有影响。
然而,有一种情形会严重影响 Javascript 的性能,那就是使用 arguments.callee。

function foo() {

    arguments.callee; // do something with this function object

    arguments.callee.caller; // and the calling function object

}

function bigLoop() {

    for(var i = 0; i < 100000; i++) {

        foo(); // Would normally be inlined...

    }

}

在上述代码中,foo 函数不再是一个简单的内联扩展,因为它需要知道它自身以及它的调用者(caller)。这不仅抵消了内联扩展所带来的性能提升,同时也破坏了函数的封装性,因为函数本身可能需要依赖于一个特定的调用背景。
因此,建议大家尽量不要使用 arguments.callee。

以上就是关于Javascript arguments 对象的全部内容了,小伙伴们是否了解透彻呢,简单的说

arguments指函数的参数对象(指实际传入的参数)
arguments.length指函数的参数对象的长度
arguments[i]指第i个参数的值(第一个为0)

Javascript 相关文章推荐
JavaScript DOM 添加事件
Feb 14 Javascript
基于jquery的实现简单的表格中增加或删除下一行
Aug 01 Javascript
jQuery prev ~ siblings选择器使用介绍
Aug 09 Javascript
调用DOM对象的focus使文本框获得焦点
Feb 19 Javascript
js字符串操作方法实例分析
May 06 Javascript
jQuery地图map悬停显示省市代码分享
Aug 20 Javascript
jquery $.trim()去除字符串空格的实现方法【附图例】
Mar 30 Javascript
[原创]JS基于FileSaver.js插件实现文件保存功能示例
Dec 08 Javascript
javascript prototype原型详解(比较基础)
Dec 26 Javascript
js图片上传的封装代码
Aug 01 Javascript
微信小程序 调用远程接口 给全局数组赋值代码实例
Aug 13 Javascript
解决vue打包报错Unexpected token: punc的问题
Oct 24 Javascript
Javascript学习笔记之 函数篇(三) : 闭包和引用
Nov 23 #Javascript
js实例属性和原型属性示例详解
Nov 23 #Javascript
JS常用函数使用指南
Nov 23 #Javascript
浅谈JSON和JSONP区别及jQuery的ajax jsonp的使用
Nov 23 #Javascript
理解jQuery stop()方法
Nov 21 #Javascript
JS中三目运算符和if else的区别分析与示例
Nov 21 #Javascript
node.js使用npm 安装插件时提示install Error: ENOENT报错的解决方法
Nov 20 #Javascript
You might like
10条PHP高级技巧[修正版]
2011/08/02 PHP
Yii框架用户登录session丢失问题解决方法
2017/01/07 PHP
form表单传递数组数据、php脚本接收的实例
2017/02/09 PHP
php生成静态页面并实现预览功能
2019/06/27 PHP
Laravel5.1 框架Middleware中间件基本用法实例分析
2020/01/04 PHP
非常漂亮的JS代码经典广告
2007/10/21 Javascript
extjs grid设置某列背景颜色和字体颜色的方法
2010/09/03 Javascript
某人初学javascript的时候写的学习笔记
2010/12/30 Javascript
JS检测图片大小的实例
2013/08/21 Javascript
js 将json字符串转换为json对象的方法解析
2013/11/13 Javascript
Jquery获得控件值的三种方法总结
2014/02/13 Javascript
AngularJs  E2E Testing 详解
2016/09/02 Javascript
简单实现bootstrap导航效果
2017/02/07 Javascript
JS利用正则表达式实现简单的密码强弱判断实例
2017/06/16 Javascript
Node.js Express安装与使用教程
2018/05/11 Javascript
webpack HappyPack实战详解
2019/10/08 Javascript
JavaScript装饰者模式原理与用法实例详解
2020/03/09 Javascript
Vue脚手架编写试卷页面功能
2020/03/17 Javascript
[01:08:44]NB vs VP 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
python构建深度神经网络(DNN)
2018/03/10 Python
Python实现的多进程和多线程功能示例
2018/05/29 Python
用Python中的turtle模块画图两只小羊方法
2019/04/09 Python
让Python脚本暂停执行的几种方法(小结)
2019/07/11 Python
Python将视频或者动态图gif逐帧保存为图片的方法
2019/09/10 Python
python实现KNN分类算法
2019/10/16 Python
使用Python刷淘宝喵币(低阶入门版)
2019/10/30 Python
python的range和linspace使用详解
2019/11/27 Python
python怎么对数字进行过滤
2020/07/05 Python
python利用线程实现多任务
2020/09/18 Python
初中物理教学反思
2014/01/14 职场文书
新学期开学标语
2014/06/30 职场文书
2015社区健康教育工作总结
2015/05/20 职场文书
《我的伯父鲁迅先生》教学反思
2016/02/16 职场文书
css position fixed 左右双定位的实现代码
2021/04/29 HTML / CSS
20180830晚上第一届KSL半决赛 雨神vs解冻(二龙 三炮解说)
2022/04/01 星际争霸
Java 定时任务技术趋势简介
2022/05/04 Java/Android