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 相关文章推荐
extjs之去除s.gif的影响
Dec 25 Javascript
JavaScript高级程序设计 客户端存储学习笔记
Sep 10 Javascript
js replace正则表达式应用案例讲解
Jan 17 Javascript
js实现在页面上弹出蒙板技巧简单实用
Apr 16 Javascript
javascript数组随机排序实例分析
Jul 22 Javascript
AngularJS数据源的多种获取方式汇总
Feb 02 Javascript
jQuery中on绑定事件后引发的事件冒泡问题如何解决
May 25 Javascript
微信小程序 封装http请求实例详解
Jan 16 Javascript
微信小程序实现的canvas合成图片功能示例
May 03 Javascript
详解Vue中组件传值的多重实现方式
Aug 16 Javascript
详解js中的原型,原型对象,原型链
Jul 16 Javascript
JavaScript中reduce()的用法
May 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
Search Engine Friendly的URL设计
2006/10/09 PHP
ZF等常用php框架中存在的问题
2008/01/10 PHP
PHP中文件上传的一个问题
2010/09/04 PHP
PHP判断搜索引擎蜘蛛并自动记忆到文件的代码
2012/02/04 PHP
PHP根据图片色界在不同位置加水印的方法
2015/07/01 PHP
PHP基于ip2long实现IP转换整形
2020/12/11 PHP
javascript中的array数组使用技巧
2010/01/31 Javascript
基于jquery的关于动态创建DOM元素的问题
2010/12/24 Javascript
JS获取鼠标相对位置的方法
2016/09/20 Javascript
AngularJS自定义插件实现网站用户引导功能示例
2016/11/07 Javascript
Angular.js中angular-ui-router的简单实践
2017/07/18 Javascript
knockoutjs模板实现树形结构列表
2017/07/31 Javascript
elementUI Vue 单个按钮显示和隐藏的变换功能(两种方法)
2018/09/04 Javascript
bootstrap-table实现表头固定以及列固定的方法示例
2019/03/07 Javascript
vue element-ui读取pdf文件的方法
2019/11/26 Javascript
Vue 实现登录界面验证码功能
2020/01/03 Javascript
python使用BeautifulSoup分析网页信息的方法
2015/04/04 Python
Python3.6正式版新特性预览
2016/12/15 Python
python之Character string(实例讲解)
2017/09/25 Python
Python中实现最小二乘法思路及实现代码
2018/01/04 Python
python2和python3在处理字符串上的区别详解
2019/05/29 Python
Python异常处理例题整理
2019/07/07 Python
Python Django框架防御CSRF攻击的方法分析
2019/10/18 Python
如何通过python实现人脸识别验证
2020/01/17 Python
Django 自定义权限管理系统详解(通过中间件认证)
2020/03/11 Python
pandas数据分组groupby()和统计函数agg()的使用
2021/03/04 Python
美国在线家居装饰店:Belle&June
2018/10/24 全球购物
后勤人员岗位职责
2013/12/17 职场文书
会议邀请书范文
2014/02/02 职场文书
《大作家的小老师》教学反思
2014/04/16 职场文书
2014年安全生产目标责任书
2014/07/23 职场文书
2014年“四风”问题个人整改措施
2014/09/17 职场文书
学校查摆问题整改措施
2014/09/28 职场文书
一个都不能少观后感
2015/06/04 职场文书
开学第一周值周总结
2015/07/16 职场文书
你为什么是穷人?可能是这5个缺点造成
2019/07/11 职场文书