Array.prototype.slice.apply的使用方法


Posted in Javascript onMarch 17, 2010
function test(){  
 //将参数转为一个数组  
  var args = Array.prototype.slice.apply(arguments);  
 alert(args);  
}

arguments在JavaScript语法中是函数特有的一个对象属性(Arguments对象),用来引用调用该函数时传递的实际参数。这个对象很象数组,拥有length属性且使用下标的形式来获取其元素,但它又并非真正的Array对象。更多关于Arguments对象的资料请参阅《JavaScript权威指南》。

所以,直接调用arguments.slice()将返回一个"Object doesn't support this property or method"错误,因为arguments不是一个真正的数组。而以上代码调用Array.prototype.slice.apply(arguments)的意义就在于它能将函数的参数对象转化为一个真正的数组。JavaScript脚本引擎如何实现我们不得而知,但这种方式确实是有效的,而且在主流浏览器上都测试通过。另一方面也可推知Arguments对象和Array对象的亲缘关系。如果你在编写JavaScript的时候,常常碰到需要将arguments对象转成Array来处理的情形,这个技巧可以帮上忙。 

这个技巧来自鼎鼎大名的DouglasCrockford。推而广之,Array其他的原型方法也可以应用在arguments上,比如: 
var arg0 = Array.prototype.shift.apply(arguments);

shift也是Array的一个实例方法,用于获取并返回数组的第一个元素。当然如上的调用虽然可执行,但却纯属多余,不如直接调用arguments[0]来的简单直接。再推而广之,我们也可以对很多形似Array的Collection对象应用这个技巧,比如Array.prototype.slice.apply(document.getElementsByTagName('div')); 不过很遗憾,IE并不支持这样的调用,Firefox和Opera则都能得到正确的结果。 

Prototype1.4中增加的$A()方法也常用来将arguments转为数组,我们看它的实现: 

var $A = Array.from = function(iterable) {  
 if(!iterable) return[];  
  if(iterable.toArray) {  
returniterable.toArray();  
 } else {  

varresults = [];  

for(vari=0; i<iterable.length; i++)  

results.push(iterable[i]);  

returnresults;  
 }  
}

Prototype用一个for循环来构造新数组,这样是为了保证最大限度的兼容性。
Javascript 相关文章推荐
编写跨浏览器的javascript代码必备[js多浏览器兼容写法]
Oct 29 Javascript
Mootools 1.2教程 Tooltips
Sep 15 Javascript
JSChart轻量级图形报表工具(内置函数中文参考)
Oct 11 Javascript
javascript中的startWith和endWith的几种实现方法
May 07 Javascript
javascript中的取反再取反~~没有意义
Apr 06 Javascript
快速解决Canvas.toDataURL 图片跨域的问题
May 10 Javascript
JS控制HTML元素的显示和隐藏的两种方法
Sep 27 Javascript
解析预加载显示图片艺术
Dec 05 Javascript
jQuery通过改变input的type属性实现密码显示隐藏切换功能
Feb 08 Javascript
用js屏蔽被http劫持的浮动广告实现方法
Aug 10 Javascript
详解给Vue2路由导航钩子和axios拦截器做个封装
Apr 10 Javascript
element-ui循环显示radio控件信息的方法
Aug 24 Javascript
javascript 打开页面window.location和window.open的区别
Mar 17 #Javascript
input 输入框内的输入事件详细分析
Mar 17 #Javascript
Jquery Ajax学习实例5 向WebService发出请求,返回泛型集合数据的异步调用
Mar 17 #Javascript
javascript中的undefined 与 null 的区别  补充篇
Mar 17 #Javascript
javascript+iframe 实现无刷新载入整页的代码
Mar 17 #Javascript
js select常用操作控制代码
Mar 16 #Javascript
js实现的日期操作类DateTime函数代码
Mar 16 #Javascript
You might like
php输出表格的实现代码(修正版)
2010/12/29 PHP
php面向对象 字段的声明与使用
2012/06/14 PHP
php对包含html标签的字符串进行截取的函数分享
2014/06/19 PHP
Laravel框架分页实现方法分析
2018/06/12 PHP
PHP Swoole异步读取、写入文件操作示例
2019/10/24 PHP
JQuery 绑定select标签的onchange事件,弹出选择的值,并实现跳转、传参
2011/01/06 Javascript
浅谈javascript中for in 和 for each in的区别
2015/04/23 Javascript
jquery结合html实现中英文页面切换
2016/11/29 Javascript
Bootstrap组件之下拉菜单,多级菜单及按钮布局方法实例
2017/05/25 Javascript
一文让你彻底搞清楚javascript中的require、import与export
2017/09/24 Javascript
AngularJS 应用模块化的使用
2018/04/04 Javascript
小程序实现带年月选取效果的日历
2018/06/27 Javascript
使用vue.js在页面内组件监听scroll事件的方法
2018/09/11 Javascript
node.js监听文件变化的实现方法
2019/04/17 Javascript
微信小程序 调用微信授权窗口相关问题解决
2019/07/25 Javascript
vue学习笔记之作用域插槽实例分析
2020/02/01 Javascript
[02:18]《我与DAC》之工作人员:为了热爱DOTA2的玩家们
2018/03/28 DOTA
[53:43]VP vs NewBee Supermajor 胜者组 BO3 第三场 6.5
2018/06/06 DOTA
python数据分析数据标准化及离散化详解
2018/02/26 Python
使用pandas实现csv/excel sheet互相转换的方法
2018/12/10 Python
使用Python向DataFrame中指定位置添加一列或多列的方法
2019/01/29 Python
情人节快乐! python绘制漂亮玫瑰
2020/08/18 Python
Python中整数的缓存机制讲解
2019/02/16 Python
python文件转为exe文件的方法及用法详解
2019/07/08 Python
python标记语句块使用方法总结
2019/08/05 Python
Python虚拟环境venv用法详解
2020/05/25 Python
如何用PyPy让你的Python代码运行得更快
2020/12/02 Python
波兰数码相机及配件网上商店: Cyfrowe.pl
2017/06/19 全球购物
英国票务网站:Ticketmaster英国
2018/08/27 全球购物
祖国在我心中演讲稿300字
2014/05/04 职场文书
会计演讲稿范文
2014/05/23 职场文书
新闻发布会策划方案
2014/06/12 职场文书
2014卖家双十一活动策划书
2014/09/29 职场文书
单位介绍信格式
2015/01/31 职场文书
2015年学校党建工作总结
2015/05/19 职场文书
成功的商业计划书这样写才最靠谱
2019/07/12 职场文书