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下组织javascript代码(js函数化)
Aug 25 Javascript
定义JavaScript二维数组采用定义数组的数组来实现
Dec 09 Javascript
jQuery Html控件基本操作(日常收集整理)
Mar 11 Javascript
如何使用jquery修改css中带有!important的样式属性
Apr 28 Javascript
JavaScript中的原型继承基础学习教程
May 06 Javascript
layui前段框架日期控件使用方法详解
May 19 Javascript
Node.JS中快速扫描端口并发现局域网内的Web服务器地址(80)
Sep 18 Javascript
AngularJS中controller控制器继承的使用方法
Nov 03 Javascript
详解vue组件基础
May 04 Javascript
vue2.0的虚拟DOM渲染思路分析
Aug 09 Javascript
vue中导出Excel表格的实现代码
Oct 18 Javascript
VUE中V-IF条件判断改变元素的样式操作
Aug 09 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
《破坏领主》销量已超100万 未来将继续开发新内容
2020/03/08 其他游戏
搜索和替换文件或目录的一个好类--很实用
2006/10/09 PHP
PHP通过session id 实现session共享和登录验证的代码
2012/06/03 PHP
php设置编码格式的方法
2013/03/05 PHP
php遍历删除整个目录及文件的方法
2015/03/13 PHP
PHP数学运算与数据处理实例分析
2016/04/01 PHP
PHP实现通过strace定位故障原因的方法
2018/04/29 PHP
php适配器模式简单应用示例
2019/10/23 PHP
Javascript 不能释放内存.
2006/09/07 Javascript
Javascript变量函数浅析
2011/09/02 Javascript
Angular的模块化(代码分享)
2016/12/26 Javascript
jquery实现焦点轮播效果
2017/02/23 Javascript
Bootstrap面板(Panels)的简单实现代码
2017/03/17 Javascript
nodejs个人博客开发第五步 分配数据
2017/04/12 NodeJs
原生js实现密码输入框值的显示隐藏
2017/07/17 Javascript
基于vue-cli创建的项目的目录结构及说明介绍
2017/11/23 Javascript
JS执行控制之节流模式实例分析
2018/12/21 Javascript
详解webpack 最简打包结果分析
2019/02/20 Javascript
React路由鉴权的实现方法
2019/09/05 Javascript
详解JavaScript类型判断的四种方法
2020/10/21 Javascript
[01:05:07]DOTA2-DPC中国联赛 正赛 DLG vs Dragon BO3 第一场2月1日
2021/03/11 DOTA
py2exe 编译ico图标的代码
2013/03/08 Python
python显示天气预报
2014/03/02 Python
Python随机数用法实例详解【基于random模块】
2017/04/18 Python
使用anaconda的pip安装第三方python包的操作步骤
2018/06/11 Python
pygame游戏之旅 添加icon和bgm音效的方法
2018/11/21 Python
浅析python的Lambda表达式
2019/02/27 Python
Python阶乘求和的代码详解
2020/02/14 Python
css3实现超立体3D图片侧翻倾斜效果
2014/04/16 HTML / CSS
HTML5拖拽功能实现的拼图游戏
2018/07/31 HTML / CSS
一些Unix笔试题和面试题
2013/01/22 面试题
会计与审计毕业生自荐信范文
2013/12/30 职场文书
党校培训思想汇报
2014/01/03 职场文书
保研推荐信
2014/05/09 职场文书
病危通知单
2015/04/17 职场文书
2015年副班长工作总结
2015/05/15 职场文书