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 get和post 方法传值注意事项
Nov 03 Javascript
Javascript学习笔记5 类和对象
Jan 11 Javascript
读jQuery之九 一些瑕疵说明
Jun 21 Javascript
JQuery中如何传递参数如click(),change()等具体实现
Apr 28 Javascript
javascript获取鼠标位置部分的实例代码(兼容IE,FF)
Aug 05 Javascript
javascript的propertyIsEnumerable()方法使用介绍
Apr 09 Javascript
使用jQuery重置(reset)表单的方法
May 05 Javascript
原生js的弹出层且其内的窗口居中
May 14 Javascript
基于JS实现一个随机生成验证码功能
May 29 Javascript
解决微信浏览器缓存站点入口文件(IIS部署Vue项目)
Jun 17 Javascript
基于JavaScript 实现拖放功能
Sep 12 Javascript
jQuery实现的图片点击放大缩小功能案例
Jan 02 jQuery
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_Cooikes不同页面无法传递的解决方法
2014/03/07 PHP
php使用正则过滤js脚本代码实例
2014/05/10 PHP
php截取中文字符串函数实例
2015/02/23 PHP
YII2框架中使用yii.js实现的post请求
2017/04/09 PHP
JavaScript CSS菜单功能 改进版
2008/12/20 Javascript
JavaScript mapreduce工作原理简析
2012/11/25 Javascript
使用jquery读取html5 localstorage的值的方法
2013/01/04 Javascript
Javascript执行效率全面总结
2013/11/04 Javascript
jQuery如何取id有.的值一般的方法是取不到的
2014/04/18 Javascript
原生js制作简单的数字键盘
2015/04/24 Javascript
javascript文本模板用法实例
2015/07/31 Javascript
全面解析Bootstrap排版使用方法(文字样式)
2015/11/30 Javascript
深入剖析JavaScript中的函数currying柯里化
2016/04/29 Javascript
AngularJS表达式讲解及示例代码
2016/08/16 Javascript
javaScript嗅探执行神器-sniffer.js
2017/02/14 Javascript
Extjs gridpanel 中的checkbox(复选框)根据某行的条件不能选中的解决方法
2017/02/17 Javascript
微信小程序 setData使用方法及常用错误解决办法
2017/05/11 Javascript
Vue仿百度搜索功能
2020/12/28 Vue.js
[01:01:29]2018DOTA2亚洲邀请赛 4.4 淘汰赛 VP vs Liquid 第一场
2018/04/05 DOTA
在RedHat系Linux上部署Python的Celery框架的教程
2015/04/07 Python
Python的Django框架中的Context使用
2015/07/15 Python
python2.x实现人民币转大写人民币
2018/06/20 Python
Django自关联实现多级联动查询实例
2020/05/19 Python
浅析python字符串前加r、f、u、l 的区别
2021/01/24 Python
CSS3 display知识详解
2015/11/25 HTML / CSS
HTML5的video标签的浏览器兼容性增强方案分享
2016/05/19 HTML / CSS
Ben Sherman官方网站:英国男装品牌
2019/10/22 全球购物
数据库方面面试题
2012/04/22 面试题
技术总监的工作职责
2013/11/13 职场文书
工厂仓管员岗位职责
2014/01/01 职场文书
住宅质量保证书
2014/04/29 职场文书
中国梦演讲稿5分钟
2014/08/19 职场文书
学校少先队工作总结
2015/08/12 职场文书
python实现自动化群控的步骤
2021/04/11 Python
深入理解Vue的数据响应式
2021/05/15 Vue.js
Python软件包安装的三种常见方法
2022/07/07 Python