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 相关文章推荐
node.js实现逐行读取文件内容的代码
Jun 27 Javascript
jQuery/CSS3图片特效插件整理推荐
Dec 07 Javascript
JS+CSS实现仿新浪微博搜索框的方法
Feb 24 Javascript
js限制文本框只能输入整数或者带小数点的数字
Apr 27 Javascript
jquery中ready()函数执行的时机和window的load事件比较
Jun 22 Javascript
jquery插件jquery.confirm弹出确认消息
Dec 22 Javascript
利用vue + element实现表格分页和前端搜索的方法
Dec 25 Javascript
JSON的parse()方法介绍
Jan 31 Javascript
详解vue2.0模拟后台json数据
May 16 Javascript
详解Vue中的基本语法和常用指令
Jul 23 Javascript
layui 富文本图片上传接口与普通按钮 文件上传接口的例子
Sep 23 Javascript
vue实现全匹配搜索列表内容
Sep 26 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中的Iterator迭代对象属性详解
2019/04/12 PHP
javascript的trim,ltrim,rtrim自定义函数
2008/09/21 Javascript
ECMAScript 6即将带给我们新的数组操作方法前瞻
2015/01/06 Javascript
jQuery实现的文字hover颜色渐变效果实例
2016/02/20 Javascript
浅谈js键盘事件全面控制
2016/12/01 Javascript
Bootstrap BootstrapDialog使用详解
2017/02/17 Javascript
深入理解JavaScript创建对象的多种方式以及优缺点
2017/06/01 Javascript
vue2.0中click点击当前li实现动态切换class
2017/06/21 Javascript
JS仿QQ好友列表展开、收缩功能(第二篇)
2017/07/07 Javascript
JQuery 获取多个select标签option的text内容(实例)
2017/09/07 jQuery
JS实现基于拖拽改变物体大小的方法
2018/01/23 Javascript
浅谈ElementUI中switch回调函数change的参数问题
2018/08/24 Javascript
傻瓜式vuex语法糖kiss-vuex整理
2018/12/21 Javascript
js实现窗口全屏示例详解
2019/09/17 Javascript
vue 调用 RESTful风格接口操作
2020/08/11 Javascript
html中创建并调用vue组件的几种方法汇总
2020/11/17 Javascript
利用node.js开发cli的完整步骤
2020/12/29 Javascript
WebStorm无法正确识别Vue3组合式API的解决方案
2021/02/18 Vue.js
Python命令行参数解析模块getopt使用实例
2015/04/13 Python
详谈Python高阶函数与函数装饰器(推荐)
2017/09/30 Python
python opencv之SURF算法示例
2018/02/24 Python
python 文本单词提取和词频统计的实例
2018/12/22 Python
对Python中class和instance以及self的用法详解
2019/06/26 Python
python和c语言的主要区别总结
2019/07/07 Python
python中open函数的基本用法示例
2019/09/07 Python
查看端口并杀进程python脚本代码
2019/12/17 Python
如何给Python代码进行加密
2020/01/10 Python
friso美素佳儿官方海外旗舰店:荷兰原产原罐
2017/07/03 全球购物
职业生涯规划书基本格式
2014/01/06 职场文书
玲玲的画教学反思
2014/02/04 职场文书
兴趣小组活动总结
2014/05/05 职场文书
房屋维修协议书范本
2014/09/25 职场文书
校运会加油稿大全
2015/07/22 职场文书
2019最新企业员工考勤管理制度(通用版)!
2019/07/02 职场文书
Flask使用SQLAlchemy实现持久化数据
2021/07/16 Python
详解Anyscript开发指南绕过typescript类型检查
2022/09/23 Javascript