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 相关文章推荐
JS 控制CSS样式表
Aug 20 Javascript
Javascript中正则表达式的全局匹配模式分析
Apr 26 Javascript
Javascript实现仿WebQQ界面的“浮云”兼容 IE7以上版本及FF
Apr 27 Javascript
jquery中的过滤操作详细解析
Dec 02 Javascript
浅谈Javascript数组的使用
Jul 29 Javascript
vue子父组件通信的实现代码
Jul 09 Javascript
十分钟带你快速了解React16新特性
Nov 10 Javascript
Webpack4+Babel7+ES6兼容IE8的实现
Apr 10 Javascript
vue实现弹幕功能
Oct 25 Javascript
vue和iview实现Scroll 数据无限滚动功能
Oct 31 Javascript
javascript实现贪吃蛇经典游戏
Apr 10 Javascript
JS开发前端团队展示控制器来为成员引流
Aug 14 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无限分类代码,支持数组格式化、直接输出菜单两种方式
2011/05/18 PHP
PHP精确计算功能示例
2016/11/29 PHP
PHP获取当前日期及本周一是几月几号的方法
2017/03/28 PHP
Joomla框架实现字符串截取的方法示例
2017/07/18 PHP
PHP goto语句用法实例
2019/08/06 PHP
可以文本显示的公告栏的js代码
2007/03/11 Javascript
jquery插件制作 表单验证实现代码
2012/08/17 Javascript
JS实现标签页效果(配合css)
2013/04/03 Javascript
Jquery插件分享之气泡形提示控件grumble.js
2014/05/20 Javascript
web打印小结
2017/01/11 Javascript
Angular2-primeNG文件上传模块FileUpload使用详解
2017/01/14 Javascript
nodejs创建简易web服务器与文件读写的实例
2017/09/07 NodeJs
Vue 中axios配置实例详解
2018/07/27 Javascript
vue.js提交按钮时进行简单的if判断表达式详解
2018/08/08 Javascript
layer弹出层倒计时关闭的实现方法
2019/09/27 Javascript
浅谈JSON5解决了JSON的两大痛点
2020/12/14 Javascript
[02:41]《西雅图我们来了》2015国际邀请赛出征全记录
2015/07/23 DOTA
python dict remove数组删除(del,pop)
2013/03/24 Python
Python入门篇之对象类型
2014/10/17 Python
Python编程中的反模式实例分析
2014/12/08 Python
python3+PyQt5重新实现自定义数据拖放处理
2018/04/19 Python
java中的控制结构(if,循环)详解
2019/06/26 Python
PyTorch 随机数生成占用 CPU 过高的解决方法
2020/01/13 Python
诺心蛋糕官网:LE CAKE
2018/08/25 全球购物
美工的岗位职责
2013/11/14 职场文书
酒店销售主管岗位职责
2014/01/04 职场文书
运动会入场口号
2014/06/07 职场文书
死亡证明书样本说明
2014/10/18 职场文书
群众路线剖析材料(四风)
2014/11/05 职场文书
毕业纪念册寄语大全
2015/02/26 职场文书
共青团员自我评价
2015/03/10 职场文书
2016大学军训通讯稿
2015/11/25 职场文书
初中班主任心得体会
2016/01/07 职场文书
Python基础之数据类型知识汇总
2021/05/18 Python
深入理解margin塌陷和margin合并的解决方案
2021/06/26 HTML / CSS
OpenCV项目实践之停车场车位实时检测
2022/04/11 Python