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 相关文章推荐
Jquery数独游戏解析(一)-页面布局
Nov 05 Javascript
jQuery遍历页面所有CheckBox查看是否被选中的方法
Apr 14 Javascript
js实现文字无缝向上滚动
Feb 16 Javascript
原生javascript实现分页效果
Apr 21 Javascript
Vue中如何实现轮播图的示例代码
Jul 27 Javascript
jQuery+HTML5实现WebGL高性能烟花绽放动画效果【附demo源码下载】
Aug 18 jQuery
vue项目中的webpack-dev-sever配置方法
Dec 14 Javascript
trackingjs+websocket+百度人脸识别API实现人脸签到
Nov 26 Javascript
Vue.js + Nuxt.js 项目中使用 Vee-validate 表单校验
Apr 22 Javascript
php结合js实现多条件组合查询
May 28 Javascript
微信小程序实现签字功能
Dec 23 Javascript
JavaScript实现滚动加载更多
Dec 27 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
SONY ICF-SW55的电路分析
2021/03/02 无线电
发布一个迷你php+AJAX聊天程序[聊天室]提供下载
2007/07/21 PHP
php知道与问问的采集插件代码
2010/10/12 PHP
浅析Yii2中GridView常见操作
2016/04/22 PHP
图片按比例缩放函数
2006/06/26 Javascript
jquery 添加节点的几种方法介绍
2013/09/04 Javascript
jQuery中$.fn的用法示例介绍
2013/11/05 Javascript
不使用ajax实现无刷新提交表单
2014/12/21 Javascript
JavaScript驾驭网页-获取网页元素
2016/03/24 Javascript
详解JavaScript对象的深浅复制
2017/03/30 Javascript
对于Javascript 执行上下文的全面了解
2017/09/05 Javascript
JavaScript常用截取字符串的三种方式用法区别实例解析
2018/05/15 Javascript
详解在React中跨组件分发状态的三种方法
2018/08/09 Javascript
vue中子组件传递数据给父组件的讲解
2019/01/27 Javascript
javascript实现自由编辑图片代码详解
2019/06/21 Javascript
如何在Vue中抽离接口配置文件
2019/10/31 Javascript
JS运算符简单用法示例
2020/01/19 Javascript
[01:11:28]DOTA2-DPC中国联赛定级赛 RNG vs Phoenix BO3第一场 1月8日
2021/03/11 DOTA
Python实现的监测服务器硬盘使用率脚本分享
2014/11/07 Python
解决Python pandas df 写入excel 出现的问题
2018/07/04 Python
python实现逐个读取txt字符并修改
2018/12/24 Python
Python线程之定位与销毁的实现
2019/02/17 Python
Python 抓取微信公众号账号信息的方法
2019/06/14 Python
基于python实现地址和经纬度转换
2020/05/19 Python
利用Python如何制作贪吃蛇及AI版贪吃蛇详解
2020/08/24 Python
Linux管理员面试题 Linux admin interview questions
2014/11/01 面试题
历史学专业毕业生求职信
2013/09/27 职场文书
测控技术与通信工程毕业生自荐信范文
2013/12/28 职场文书
会计学生自我鉴定
2014/02/06 职场文书
开门红主持词
2014/04/02 职场文书
房屋公证委托书
2014/04/03 职场文书
电影红河谷观后感
2015/06/11 职场文书
在职证明书模板
2015/06/15 职场文书
2019财务毕业实习报告
2019/06/27 职场文书
nginx常用命令放入shell脚本详解
2021/03/31 Servers
Python中的turtle画箭头,矩形,五角星
2022/03/16 Python