将函数的实际参数转换成数组的方法


Posted in Javascript onJanuary 25, 2010

值得庆幸的是,我们可以通过数组的 slice 方法将 arguments 对象转换成真正的数组:
var args = Array.prototype.slice.call(arguments);
对于slice 方法,ECMAScript 262 中 15.4.4.10 Array.prototype.slice (start, end) 章节有备注:

The slice function is intentionally generic; it does not require that its this value be an Array object. Therefore it can be transferred to other kinds of objects for use as a method. Whether the slice function can be applied successfully to a host object is implementation-dependent.

《Pro JavaScript Design Patterns》(《JavaScript 设计模式》)的作者 Dustin Diaz 曾指出:

instead of… 
var args = Array.prototype.slice.call(arguments); // 怿飞注:下称方法一 
do this… 
var args = [].slice.call(arguments, 0); // 怿飞注:下称方法二

但二者的性能差异真的存在吗?经过个人简单测试发现:

在 arguments.length 较小的时候,方法二性能上稍有一点点优势,而在arguments.length 较大的时候,方法一却又稍有优势。

最后附上方法三,最老土的方式:

var args = []; 
for (var i = 1; i < arguments.length; i++) { 
args.push(arguments[i]); 
}

不过对于平常来说,个人建议还是使用第二种方法,但任何解决方案,没有最好的,只有最合适:
var args = [].slice.call(arguments, 0); 
理由有二:

一般的函数的 arguments.length 都在 10 以内,方法二有优势;
方法二的代码量上也比第一种少,至少可以减小一点字节 ^^

如何将 NodeList (比如:document.getElementsByTagName('div'))转换成数组呢?

解决方案简单如下:

function nodeListToArray(nodes){ 
var arr, length; 
try { 
// works in every browser except IE 
arr = [].slice.call(nodes); 
return arr; 
} catch(err){ 
// slower, but works in IE 
arr = []; 
length = nodes.length; 
for(var i = 0; i < length; i++){ 
arr.push(nodes[i]); 
} 
return arr; 
} 
}

为什么 IE 中 NodeList 不可以使用 [].slice.call(nodes) 方法转换呢?
In Internet Explorer it throws an error that it can't run Array.prototype.slice.call(nodes) because a DOM NodeList is not a JavaScript object.
Javascript 相关文章推荐
网页右键ie不支持event.preventDefault和event.returnValue (需要加window)
Feb 22 Javascript
使用js的replace()方法查找字符示例代码
Oct 28 Javascript
jquery操作select详解(取值,设置选中)
Feb 07 Javascript
将字符串中由空格隔开的每个单词首字母大写
Apr 06 Javascript
使用不同的方法结合/合并两个JS数组
Sep 18 Javascript
JavaScript实现文本框中默认显示背景图片在获得焦点后消失的方法
Jul 01 Javascript
Javascript获取随机数的实现方法
Jun 22 Javascript
JS+HTML5实现的前端购物车功能插件实例【附demo源码下载】
Oct 17 Javascript
基于JS组件实现拖动滑块验证功能(代码分享)
Nov 18 Javascript
vue里面使用mui的弹出日期选择插件实例
Sep 16 Javascript
JQuery判断radio单选框是否选中并获取值的方法
Jan 17 jQuery
使用watch在微信小程序中实现全局状态共享
Jun 03 Javascript
javascript中利用数组实现的循环队列代码
Jan 24 #Javascript
document.getElementById为空或不是对象的解决方法
Jan 24 #Javascript
JavaScript 未结束的字符串常量常见解决方法
Jan 24 #Javascript
php gethostbyname获取域名ip地址函数详解
Jan 24 #Javascript
setTimeout与setInterval在不同浏览器下的差异
Jan 24 #Javascript
js 模拟实现类似c#下的hashtable的简单功能代码
Jan 24 #Javascript
jQuery 1.4 15个你应该知道的新特性(译)
Jan 24 #Javascript
You might like
全国FM电台频率大全 - 1 北京市
2020/03/11 无线电
长波知识介绍
2021/03/01 无线电
php&amp;java(三)
2006/10/09 PHP
关于php内存不够用的快速解决方法
2013/10/26 PHP
PHP date()格式MySQL中插入datetime方法
2019/01/29 PHP
PHP大文件切割上传并带进度条功能示例
2019/07/01 PHP
laravel 解决路由除了根目录其他都404的问题
2019/10/18 PHP
(jQuery,mootools,dojo)使用适合自己的编程别名命名
2010/09/14 Javascript
THREE.JS入门教程(4)创建粒子系统
2013/01/24 Javascript
jquery日历控件实现方法分享
2014/03/07 Javascript
JavaScript监听文本框回车事件并过滤文本框空格的方法
2015/04/16 Javascript
jQuery给指定的table动态添加删除行的操作方法
2016/10/12 Javascript
MUI  Scroll插件的使用详解
2017/04/13 Javascript
MvcPager分页控件 适用于Bootstrap
2017/06/03 Javascript
浅谈Redux中间件的实践
2018/07/27 Javascript
详解js中let与var声明变量的区别
2020/04/05 Javascript
微信小程序之 catalog 切换实现解析
2019/09/12 Javascript
Vue data的数据响应式到底是如何实现的
2020/02/11 Javascript
JavaScript实现手机号码 3-4-4格式并控制新增和删除时光标的位置
2020/06/02 Javascript
原生js实现弹幕效果
2020/11/29 Javascript
[54:17]DOTA2-DPC中国联赛定级赛 RNG vs iG BO3第二场 1月10日
2021/03/11 DOTA
从零开始学Python第八周:详解网络编程基础(socket)
2016/12/14 Python
Python实现的快速排序算法详解
2017/08/01 Python
Python实现将doc转化pdf格式文档的方法
2018/01/19 Python
解决Django数据库makemigrations有变化但是migrate时未变动问题
2018/05/30 Python
Python-jenkins模块获取jobs的执行状态操作
2020/05/12 Python
Python json解析库jsonpath原理及使用示例
2020/11/25 Python
收集的22款给力的HTML5和CSS3帮助工具
2012/09/14 HTML / CSS
瑞典在互联网上最大的宠物商店:Animail
2020/10/31 全球购物
别名指示符是什么
2012/10/08 面试题
护士试用期自我鉴定
2014/02/08 职场文书
学校募捐倡议书
2014/05/14 职场文书
深度好文:50条没人告诉你的人生经验,句句精辟
2019/08/22 职场文书
vue引入Excel表格插件的方法
2021/04/28 Vue.js
漫画「处刑少女的生存之道」第3卷封面公开
2022/03/21 日漫
CDPR谈《巫师》新作用虚幻5原因 称不会为Epic独占
2022/04/06 其他游戏