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编程起步(第六课)
Feb 27 Javascript
探讨在JQuery和Js中,如何让ajax执行完后再继续往下执行
Jul 09 Javascript
基于jQuery+PHP+Mysql实现在线拍照和在线浏览照片
Sep 06 Javascript
直接拿来用的15个jQuery代码片段
Sep 23 Javascript
javascript实现瀑布流加载图片原理
Feb 02 Javascript
Javascript自定义事件详解
Jan 13 Javascript
js 博客内容进度插件详解
Feb 19 Javascript
JavaScript实现换肤功能
Sep 15 Javascript
jquery 给动态生成的标签绑定事件的几种方法总结
Feb 24 jQuery
如何在微信小程序里面退出小程序的方法
Apr 28 Javascript
微信小程序框架的页面布局代码
Aug 17 Javascript
vue使用一些外部插件及样式的配置代码
Nov 18 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
理解PHP5中static和const关键字的区别
2007/03/19 PHP
优化使用mysql存储session的php代码
2008/01/10 PHP
PHP面向对象之工作单元(实例讲解)
2017/06/26 PHP
关于php支持的协议与封装协议总结(推荐)
2017/11/17 PHP
php反序列化长度变化尾部字符串逃逸(0CTF-2016-piapiapia)
2020/02/15 PHP
asp 取文本框名称代码
2008/12/02 Javascript
学习ExtJS table布局
2009/10/08 Javascript
JS 实现完美include载入实现代码
2010/08/05 Javascript
js 使用form表单select类实现级联菜单效果
2012/12/19 Javascript
js点击按钮实现带遮罩层的弹出视频效果
2015/12/19 Javascript
JS深度拷贝Object Array实例分析
2016/03/31 Javascript
PHP自动加载autoload和命名空间的应用小结
2017/12/01 Javascript
pm2发布node配置文件ecosystem.json详解
2019/05/15 Javascript
vue如何在项目中调用腾讯云的滑动验证码
2020/07/15 Javascript
windows下安装python paramiko模块的代码
2013/02/10 Python
Python实现同时兼容老版和新版Socket协议的一个简单WebSocket服务器
2014/06/04 Python
在Python的框架中为MySQL实现restful接口的教程
2015/04/08 Python
python 寻找优化使成本函数最小的最优解的方法
2017/12/28 Python
Python应用领域和就业形势分析总结
2019/05/14 Python
Python 实现遥感影像波段组合的示例代码
2019/08/04 Python
基于Python pyecharts实现多种图例代码解析
2020/08/10 Python
python3代码中实现加法重载的实例
2020/12/03 Python
详解css3中的伪类before和after常见用法
2020/11/17 HTML / CSS
美国求婚钻戒网站:Super Jeweler
2016/08/27 全球购物
台湾SHOPRO购物行家:亚洲首创影视.3C.家电.优质购物平台
2018/05/07 全球购物
俄罗斯GamePark游戏商店网站:购买游戏、游戏机和配件
2020/03/13 全球购物
GOLFINO英国官网:高尔夫服装
2020/04/11 全球购物
Weblogic和WebSphere不同特点
2012/05/09 面试题
自我评价优秀范文分享
2013/11/30 职场文书
农村门前三包责任书
2014/07/25 职场文书
个人作风建设自查报告
2014/10/22 职场文书
建议书格式
2015/02/04 职场文书
教师个人教学总结
2015/02/11 职场文书
党员个人总结范文
2015/02/14 职场文书
大学生自荐书范文
2015/03/05 职场文书
2015年三好一满意工作总结
2015/07/24 职场文书