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 相关文章推荐
JavaScript 原型继承
Dec 26 Javascript
JavaScript匿名函数之模仿块级作用域
Dec 12 Javascript
React实现双向绑定示例代码
Sep 19 Javascript
JavaScript字符集编码与解码详谈
Feb 02 Javascript
Angular2开发环境搭建教程之VS Code
Dec 15 Javascript
Angular使用动态加载组件方法实现Dialog的示例
May 11 Javascript
在Vue项目中引入JQuery-ui插件的讲解
Jan 27 jQuery
ES6中Set和Map数据结构,Map与其它数据结构互相转换操作实例详解
Feb 28 Javascript
深入理解react 组件类型及使用场景
Mar 07 Javascript
详解vue-cli3 中跨域解决方案
Apr 10 Javascript
VUE.js实现动态设置输入框disabled属性
Oct 28 Javascript
OpenLayers3实现地图显示功能
Sep 25 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
老机欣赏|中国60年代精品收音机
2021/03/02 无线电
详解WordPress中简码格式标签编写的基本方法
2015/12/22 PHP
php连接MSsql server的五种方法总结
2018/03/04 PHP
农历与西历对照
2006/09/06 Javascript
Javascript &amp; DHTML 实例编程(教程)基础知识
2007/06/02 Javascript
在Ajax中使用Flash实现跨域数据读取的实现方法
2010/12/02 Javascript
Jquery中删除元素的实现代码
2011/12/29 Javascript
Jquery getJSON方法详细分析
2013/12/26 Javascript
当达到输入长度时表单自动切换焦点
2014/04/06 Javascript
form.submit()不能提交表单的原因分析
2014/10/23 Javascript
深入学习Bootstrap表单
2016/12/13 Javascript
js仿微信公众平台打标签功能
2017/04/08 Javascript
js编写选项卡效果
2017/05/23 Javascript
实例学习JavaScript读取和写入cookie
2018/01/29 Javascript
Angular 4.x+Ionic3踩坑之Ionic3.x pop反向传值详解
2018/03/13 Javascript
转换layUI的数据表格中的日期格式方法
2019/09/19 Javascript
基于Nuxt.js项目的服务端性能优化与错误检测(容错处理)
2019/10/23 Javascript
Vue的data、computed、watch源码浅谈
2020/04/04 Javascript
python使用多线程不断刷新网页的方法
2015/03/31 Python
Python数据结构之翻转链表
2017/02/25 Python
Python实现字符串与数组相互转换功能示例
2017/09/22 Python
在Python 中实现图片加框和加字的方法
2019/01/26 Python
django settings.py 配置文件及介绍
2019/07/15 Python
使用python制作一个解压缩软件
2019/11/13 Python
美国女性卫生用品公司:Thinx
2017/06/30 全球购物
Blue Nile台湾:钻石珠宝商,订婚首饰、结婚戒指和精品首饰
2017/11/24 全球购物
Crabtree & Evelyn英国官网:瑰珀翠护手霜、香水、沐浴和身体护理
2018/04/26 全球购物
德国价格合理的品牌商品购物网站:averdo
2019/03/21 全球购物
超级搞笑检讨书
2014/01/15 职场文书
一年级学生期末评语
2014/04/21 职场文书
营销经理工作检讨书
2014/11/03 职场文书
会计求职自荐信范文
2015/03/04 职场文书
鉴史问廉观后感
2015/06/10 职场文书
八年级作文之友情
2019/11/25 职场文书
Python函数中的不定长参数相关知识总结
2021/06/24 Python
向Spring IOC 容器动态注册bean实现方式
2022/07/15 Java/Android