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+json实现数据列表分页示例代码
Nov 15 Javascript
JSF中confirm弹出框的用法示例介绍
Jan 07 Javascript
Javscript调用iframe框架页面中函数的方法
Nov 01 Javascript
JavaScript+Java实现HTML页面转为PDF文件保存的方法
May 30 Javascript
ReactNative-JS 调用原生方法实例代码
Oct 08 Javascript
DOM 事件的深入浅出(二)
Dec 05 Javascript
通过jsonp获取json数据实现AJAX跨域请求
Jan 22 Javascript
jQuery实现页码跳转式动态数据分页
Dec 31 jQuery
基于$.ajax()方法从服务器获取json数据的几种方式总结
Jan 31 Javascript
微信小程序scroll-view实现字幕滚动
Jul 14 Javascript
Element的el-tree控件后台数据结构的生成以及方法的抽取
Mar 05 Javascript
解决vue中axios设置超时(超过5分钟)没反应的问题
Sep 04 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
PHP3 safe_mode 失效漏洞
2006/10/09 PHP
PHP中调用ASP.NET的WebService的代码
2011/04/22 PHP
PHP中使用mktime获取时间戳的一个黑色幽默分析
2012/05/31 PHP
php使用PDO方法详解
2014/12/27 PHP
PHP用FTP类上传文件视频等的简单实现方法
2016/09/23 PHP
php禁用cookie后session设置方法分析
2016/10/19 PHP
PHP实现字母数字混合验证码功能
2019/07/11 PHP
php函数式编程简单示例
2019/08/08 PHP
PHP反射原理与用法深入分析
2019/09/28 PHP
js写的方法实现上传图片之后查看大图
2014/03/05 Javascript
js显示当前日期时间和星期几
2015/10/22 Javascript
js操作数组函数实例小结
2015/12/10 Javascript
jQuery实现简单的图片查看器
2020/09/11 Javascript
JQuery点击事件回到页面顶部效果的实现代码
2016/05/24 Javascript
Vue.js报错Failed to resolve filter问题的解决方法
2016/05/25 Javascript
javascript中Date对象的使用总结
2016/11/21 Javascript
微信小程序商品到详情的实现
2017/06/27 Javascript
详解node+express+ejs+bootstrap构建项目
2017/09/27 Javascript
JS中Promise函数then的奥秘探究
2018/07/30 Javascript
python简单实现基于SSL的IRC bot实例
2015/06/15 Python
Python引用传值概念与用法实例小结
2017/10/07 Python
python读写csv文件实例代码
2019/07/05 Python
关于torch.optim的灵活使用详解(包括重写SGD,加上L1正则)
2020/02/20 Python
python使用Word2Vec进行情感分析解析
2020/07/31 Python
Python3 pyecharts生成Html文件柱状图及折线图代码实例
2020/09/29 Python
css3圆角样式分享自定义按钮样式
2013/12/27 HTML / CSS
美国照明、家居装饰和家具购物网站:Bellacor
2017/09/20 全球购物
马来西亚综合购物网站:Lazada马来西亚
2018/06/05 全球购物
澳大利亚个性化儿童礼品网站:Bright Star Kids
2019/06/14 全球购物
致跳远运动员广播稿
2014/02/11 职场文书
改作风抓落实促发展心得体会
2014/09/10 职场文书
建议书范文
2015/02/05 职场文书
博士生专家推荐信
2015/03/25 职场文书
2016年度基层党建工作公开承诺书
2016/03/25 职场文书
Python scrapy爬取起点中文网小说榜单
2021/06/13 Python
PyTorch中permute的使用方法
2022/04/26 Python