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的让textarea自适应高度的插件
Aug 03 Javascript
基于JQuery的访问WebService的代码(可访问Java[Xfire])
Nov 19 Javascript
如何使用jquery控制CSS样式,并且取消Css样式(如背景色,有实例)
Jul 09 Javascript
js通过location.search来获取页面传来的参数
Sep 11 Javascript
Node.js实现JS文件合并小工具
Feb 02 Javascript
基于AngularJS前端云组件最佳实践
Oct 20 Javascript
快速掌握jQuery插件WebUploader文件上传
Nov 07 Javascript
AngularJS中directive指令使用之事件绑定与指令交互用法示例
Nov 22 Javascript
Node.js复制文件的方法示例
Dec 29 Javascript
jquery获取下拉框中的循环值
Feb 08 Javascript
基于jQuery实现无缝轮播与左右点击效果
May 13 jQuery
JS创建或填充任意长度数组的小技巧汇总
Oct 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判断文件上传类型及过滤不安全数据的方法
2014/12/17 PHP
Django 中 cookie的使用
2017/08/17 PHP
phpStudy 2016 使用教程详解(支持PHP7)
2017/10/18 PHP
基于JQuery实现鼠标点击文本框显示隐藏提示文本
2012/02/23 Javascript
jquery post方式传递多个参数值后台以数组的方式进行接收
2013/01/11 Javascript
javaScript实现浮点数转十六进制字符
2013/10/29 Javascript
jquery动态加载select下拉框示例代码
2013/12/10 Javascript
与Math.pow 相反的函数使用介绍
2014/08/04 Javascript
$(&quot;&quot;).click与onclick的区别示例介绍
2014/09/25 Javascript
jQuery对象和DOM对象之间相互转换的方法介绍
2015/02/28 Javascript
AngularJS实现textarea记录只能输入规定数量的字符并显示
2016/04/26 Javascript
jQuery下拉框的简单应用
2016/06/24 Javascript
原生JS实现首页进度加载动画
2016/09/14 Javascript
javascript创建对象的3种方法
2016/11/02 Javascript
Radio 单选JS动态添加的选项onchange事件无效的解决方法
2016/12/12 Javascript
jQuery插件之validation插件
2017/03/29 jQuery
angularJs使用$watch和$filter过滤器制作搜索筛选实例
2017/06/01 Javascript
angular实现图片懒加载实例代码
2017/06/08 Javascript
Angular.js实现获取验证码倒计时60秒按钮的简单方法
2017/10/18 Javascript
Gulp实现静态网页模块化的方法详解
2018/01/09 Javascript
详解ES6中的三种异步解决方案
2018/06/28 Javascript
javascript实现前端成语点击验证优化
2020/06/24 Javascript
[01:18]DOTA2超级联赛专访hanci ForLove淘汰感言曝光
2013/06/04 DOTA
python处理二进制数据的方法
2015/06/03 Python
Python深入06——python的内存管理详解
2016/12/07 Python
Python Gitlab Api 使用方法
2019/08/28 Python
Python从入门到精通之环境搭建教程图解
2019/09/26 Python
python爬虫中抓取指数的实例讲解
2020/12/01 Python
AC Lens:购买隐形眼镜
2017/02/26 全球购物
法国滑雪假期的专家:Ski Planet
2019/11/02 全球购物
我的大学生活职业生涯规划
2014/01/02 职场文书
优秀教师先进事迹
2014/01/22 职场文书
英文留学推荐信范文
2014/01/25 职场文书
写给老婆的保证书
2015/02/27 职场文书
vue代码分块和懒加载非必要资源文件
2022/04/11 Vue.js
Go微服务项目配置文件的定义和读取示例详解
2022/06/21 Golang