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 相关文章推荐
技术男用来对妹子表白的百度首页
Jul 23 Javascript
DOM节点的替换或修改函数replaceChild()用法实例
Jan 12 Javascript
全国省市二级联动下拉菜单 js版
May 10 Javascript
javascript 动态脚本添加的简单方法
Oct 11 Javascript
node.js版本管理工具n无效的原理和解决方法
Nov 24 Javascript
jQuery实现验证码功能
Mar 17 Javascript
JavaScript EventEmitter 背后的秘密 完整版
Mar 29 Javascript
详解puppeteer使用代理
Dec 27 Javascript
Vue 使用formData方式向后台发送数据的实现
Apr 14 Javascript
使用 node.js 模仿 Apache 小部分功能
Jul 07 Javascript
简单谈谈javascript高级特性
Sep 04 Javascript
js实现拖动缓动效果
Jan 13 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输出图像imagegif、imagejpeg与imagepng函数用法分析
2016/11/14 PHP
javascript下操作css的float属性的特殊写法
2007/08/22 Javascript
目前流行的JavaScript库的介绍及对比
2013/09/29 Javascript
jquery.ajax的url中传递中文乱码问题的解决方法
2014/02/07 Javascript
javascript实现修改微信分享的标题内容等
2014/12/11 Javascript
JavaScript实现的多种鼠标拖放效果
2015/11/03 Javascript
总结JavaScript三种数据存储方式之间的区别
2016/05/03 Javascript
纯js实现手风琴效果代码
2020/04/17 Javascript
详解angularjs实现echart图表效果最简洁教程
2017/11/29 Javascript
微信小程序实现点击按钮修改文字大小功能【附demo源码下载】
2017/12/06 Javascript
elementUI 设置input的只读或禁用的方法
2018/10/30 Javascript
vue基础之使用get、post、jsonp实现交互功能示例
2019/03/12 Javascript
使用node搭建自动发图文微博机器人的方法
2019/03/22 Javascript
vue实现抖音时间转盘
2019/09/08 Javascript
使用JavaScript计算前一天和后一天的思路详解
2019/12/20 Javascript
JavaScript设计模式--简单工厂模式定义与应用案例详解
2020/05/23 Javascript
js 动态校验开始结束时间的实现代码
2020/05/25 Javascript
通过实例了解JS执行上下文运行原理
2020/06/17 Javascript
解决Element中el-date-picker组件不回填的情况
2020/11/07 Javascript
基于Python实现对PDF文件的OCR识别
2016/08/05 Python
Python 通过微信控制实现app定位发送到个人服务器再转发微信服务器接收位置信息
2019/08/05 Python
通过实例解析Python调用json模块
2019/12/11 Python
python+selenium+chromedriver实现爬虫示例代码
2020/04/10 Python
把Anaconda中的环境导入到Pycharm里面的方法步骤
2020/10/30 Python
python 利用jieba.analyse进行 关键词提取
2020/12/17 Python
简述Html5 IphoneX 适配方法
2018/02/08 HTML / CSS
高中毕业自我鉴定
2013/12/13 职场文书
农民入党思想汇报
2014/01/03 职场文书
卖车协议书范本4篇
2014/10/01 职场文书
2015年勤工助学工作总结
2015/04/29 职场文书
机器人瓦力观后感
2015/06/12 职场文书
行政复议答复书
2015/07/01 职场文书
教师节联欢会主持词
2015/07/04 职场文书
SpringBoot SpringEL表达式的使用
2021/07/25 Java/Android
SQL实战演练之网上商城数据库商品类别数据操作
2021/10/24 MySQL
MySQL优化及索引解析
2022/03/17 MySQL