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 相关文章推荐
在网页中屏蔽快捷键
Sep 06 Javascript
jquery插件实现鼠标经过图片右侧显示大图的效果(类似淘宝)
Feb 04 Javascript
Jquery Validate 正则表达式实用验证代码大全
Aug 23 Javascript
浅谈nodeName,nodeValue,nodeType,typeof 的区别
Jan 13 Javascript
原生js和jquery实现图片轮播特效
Apr 23 Javascript
jquery获取select选中值的方法分析
Dec 22 Javascript
javascript基础语法——全面理解变量和标识符
Jun 02 Javascript
js将键值对字符串转为json字符串的方法
Mar 30 Javascript
JS和Canvas实现图片的预览压缩和上传功能
Mar 30 Javascript
vue表单自定义校验规则介绍
Aug 28 Javascript
如何通过shell脚本自动生成vue文件详解
Sep 10 Javascript
d3.js实现图形缩放平移
Dec 19 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
php重定向的三种方法分享
2012/02/22 PHP
PHP错误提示的关闭方法详解
2013/06/23 PHP
解析php mysql 事务处理回滚操作(附实例)
2013/08/05 PHP
百度地图API应用之获取用户的具体位置
2014/06/10 PHP
Php-Redis安装测试笔记
2015/03/05 PHP
搭建基于Docker的PHP开发环境的详细教程
2015/07/01 PHP
PHP入门教程之数学运算技巧总结
2016/09/11 PHP
ThinkPHP框架整合微信支付之Native 扫码支付模式二图文详解
2019/04/09 PHP
解析Jquery取得iframe中元素的几种方法
2013/07/04 Javascript
轻松创建nodejs服务器(6):作出响应
2014/12/18 NodeJs
jQuery取消ajax请求的方法
2015/06/09 Javascript
详解JavaScript中jQuery和Ajax以及JSONP的联合使用
2015/08/13 Javascript
js实现tab切换效果
2017/02/16 Javascript
AngularJs用户输入动态模板XSS攻击示例详解
2018/04/21 Javascript
详解Vue CLI3配置解析之css.extract
2018/09/14 Javascript
vue+高德地图写地图选址组件的方法
2019/05/18 Javascript
js变量值传到php过程详解 将php解析成数据
2019/06/26 Javascript
vue二选一tab栏切换新做法实现
2021/01/19 Vue.js
Python urlopen()函数 示例分享
2014/06/12 Python
Python3遍历目录树实现方法
2015/05/22 Python
Python下Fabric的简单部署方法
2015/07/14 Python
Python爬取APP下载链接的实现方法
2016/09/30 Python
python并发编程之线程实例解析
2017/12/27 Python
python中cPickle类使用方法详解
2018/08/27 Python
在python tkinter中Canvas实现进度条显示的方法
2019/06/14 Python
如何使用python传入不确定个数参数
2020/02/18 Python
Django单元测试中Fixtures的使用方法
2020/02/26 Python
python实现简单的tcp 文件下载
2020/09/16 Python
小学家长会邀请函
2014/01/23 职场文书
人事经理岗位职责
2014/04/28 职场文书
法制宣传教育方案
2014/05/09 职场文书
幸福家庭标语
2014/06/27 职场文书
2014年科协工作总结
2014/12/09 职场文书
狼牙山五壮士观后感
2015/06/09 职场文书
学习型家庭事迹材料(2016精选版)
2016/02/29 职场文书
python中pandas.read_csv()函数的深入讲解
2021/03/29 Python