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 相关文章推荐
Gird事件机制初级读本
Mar 10 Javascript
浅谈javascript的原型继承
Jul 25 Javascript
jquery 插件学习(四)
Aug 06 Javascript
一个奇葩的最短的 IE 版本判断JS脚本
May 28 Javascript
使用jquery修改表单的提交地址基本思路
Jun 04 Javascript
JavaScript通过setTimeout实时显示当前时间的方法
Apr 16 Javascript
Jsonp post 跨域方案
Jul 06 Javascript
JavaScript编程中的Promise使用大全
Jul 28 Javascript
微信js-sdk预览图片接口及从拍照或手机相册中选图接口用法示例
Oct 13 Javascript
从零开始学习Node.js系列教程之基于connect和express框架的多页面实现数学运算示例
Apr 13 Javascript
Javascript迭代、递推、穷举、递归常用算法实例讲解
Feb 01 Javascript
jQuery插件实现图片轮播效果
Oct 19 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
上海永华YH-R296(华普R-96)12波段立体声收音机的分析和打理
2021/03/02 无线电
实战mysql导出中文乱码及phpmyadmin导入中文乱码的解决方法
2010/06/11 PHP
PHP中__get()和__set()的用法实例详解
2013/06/04 PHP
PHP语法自动检查的Vim插件
2014/08/11 PHP
PHP多文件上传类实例
2015/03/07 PHP
php中动态调用函数的方法
2015/03/16 PHP
php版银联支付接口开发简明教程
2016/10/14 PHP
phpStorm+XDebug+chrome 配置详解
2019/04/01 PHP
PHP中Session ID的实现原理实例分析
2019/08/17 PHP
php报错502badgateway解决方法
2019/10/11 PHP
一个tab标签切换效果代码
2009/03/27 Javascript
js跳转页面方法实现汇总
2014/02/11 Javascript
js检测浏览器版本、核心、是否移动端示例
2014/04/24 Javascript
Javascript基础教程之数据类型转换
2015/01/18 Javascript
Javascript 拖拽的一些高级的应用(逐行分析代码,让你轻松了拖拽的原理)
2015/01/23 Javascript
php结合imgareaselect实现图片裁剪
2015/07/05 Javascript
JS DOMReady事件的六种实现方法总结
2016/11/23 Javascript
jquery对象与DOM对象转化
2017/02/08 Javascript
在vue中动态添加class类进行显示隐藏实例
2019/11/09 Javascript
wxPython窗口中文乱码解决方法
2014/10/11 Python
八大排序算法的Python实现
2021/01/28 Python
Python中二维列表如何获取子区域元素的组成
2017/01/19 Python
Python的numpy库中将矩阵转换为列表等函数的方法
2018/04/04 Python
python中copy()与deepcopy()的区别小结
2018/08/03 Python
selenium+python自动化测试之多窗口切换
2019/01/23 Python
python pillow模块使用方法详解
2019/08/30 Python
使用Tensorflow将自己的数据分割成batch训练实例
2020/01/20 Python
Python单链表原理与实现方法详解
2020/02/22 Python
python实现字符串和数字拼接
2020/03/02 Python
django迁移文件migrations的实现
2020/03/31 Python
html5+css3之动画在webapp中的应用
2014/11/21 HTML / CSS
说一下mysql, oracle等常见数据库的分页实现方案
2012/09/29 面试题
介绍一下Prototype的$()函数,$F()函数,$A()函数都是什么作用?
2014/03/05 面试题
妇女儿童发展规划实施方案
2014/03/16 职场文书
2015法院个人工作总结范文
2015/05/25 职场文书
springboot集成redis存对象乱码的问题及解决
2022/06/16 Java/Android