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函数以及基础写法100多条实用整理
Jan 13 Javascript
基于JavaScript 类的使用详解
May 07 Javascript
Highcharts 非常实用的Javascript统计图demo示例
Jul 03 Javascript
laypage分页控件使用实例详解
May 19 Javascript
jquery datatable服务端分页
Aug 31 Javascript
JS类的定义与使用方法深入探索
Nov 26 Javascript
JS数组排序方法实例分析
Dec 16 Javascript
bootstrap laydate日期组件使用详解
Jan 04 Javascript
JS设计模式之单例模式(一)
Sep 29 Javascript
浅析vue-router jquery和params传参(接收参数)$router $route的区别
Aug 03 jQuery
taro 实现购物车逻辑的实例代码
Jun 05 Javascript
vue-cli3 引入 font-awesome的操作
Aug 11 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 获取mysql数据库信息代码
2009/03/12 PHP
php程序内部post数据的方法
2015/03/31 PHP
laravel框架模型和数据库基础操作实例详解
2020/01/25 PHP
百度 popup.js 完美修正版非常的不错 脚本之家推荐
2009/04/17 Javascript
javascript 实用的文字链提示框效果
2010/06/30 Javascript
表单切换,用回车键替换Tab健(不支持IE)
2011/07/20 Javascript
JavaScript字符串常用类使用方法汇总
2015/04/14 Javascript
举例讲解jQuery对DOM元素的向上遍历、向下遍历和水平遍历
2016/07/07 Javascript
AugularJS从入门到实践(必看篇)
2017/07/10 Javascript
vue用addRoutes实现动态路由的示例
2017/09/15 Javascript
vue-image-crop基于Vue的移动端图片裁剪组件示例
2018/08/28 Javascript
react配置antd按需加载的使用
2019/02/11 Javascript
js 计算图片内点个数的示例代码
2019/04/04 Javascript
基于JavaScript获取base64图片大小
2019/10/18 Javascript
微信小程序转化为uni-app项目的方法示例
2020/05/22 Javascript
[47:35]VP vs Pain 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/20 DOTA
python检测是文件还是目录的方法
2015/07/03 Python
在Django框架中设置语言偏好的教程
2015/07/27 Python
Python模拟百度登录实例详解
2016/01/20 Python
在python下使用tensorflow判断是否存在文件夹的实例
2019/06/10 Python
使用Flask-Cache缓存实现给Flask提速的方法详解
2019/06/11 Python
python 变量初始化空列表的例子
2019/11/28 Python
挪威太阳镜和眼镜网上商城:SmartBuyGlasses挪威
2016/08/20 全球购物
西班牙三叶草药房:Farmacias Trébol
2019/05/03 全球购物
抽象方法、抽象类怎样声明
2014/10/25 面试题
《夸父追日》教学反思
2014/02/26 职场文书
农村党支部书记四风问题个人对照检查材料
2014/09/21 职场文书
副检察长四风问题对照检查材料思想汇报
2014/10/07 职场文书
无财产离婚协议书范本
2014/10/28 职场文书
2015个人半年总结范文
2015/03/09 职场文书
研究生简历自我评
2015/03/11 职场文书
2015年打非治违工作总结
2015/04/02 职场文书
中小企业员工手册范本
2015/05/14 职场文书
党员转正申请报告
2015/05/15 职场文书
Python代码风格与编程习惯重要吗?
2021/06/03 Python
PyTorch中permute的使用方法
2022/04/26 Python