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 相关文章推荐
Mozilla中显示textarea中选择的文字
Sep 07 Javascript
javascript之querySelector和querySelectorAll使用说明
Oct 09 Javascript
js中对象的声明方式以及数组的一些用法示例
Dec 11 Javascript
jQuery实现鼠标可拖动调整表格列宽度
May 26 Javascript
JS实现可直接显示网页代码运行效果的HTML代码预览功能实例
Aug 06 Javascript
jQuery 3.0十大新特性
Jul 06 Javascript
AngularJS用户选择器指令实例分析
Nov 04 Javascript
vue2.0 中#$emit,$on的使用详解
Jun 07 Javascript
微信页面弹出键盘后iframe内容变空白的解决方案
Sep 20 Javascript
使用javaScript实现鼠标拖拽事件
Apr 03 Javascript
原生JavaScript创建不可变对象的方法简单示例
May 07 Javascript
vue-cli4使用全局less文件中的变量配置操作
Oct 21 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
php中怎么搜索相关联数组键值及获取之
2013/10/17 PHP
PHP判断是否有Get参数的方法
2014/05/05 PHP
php自定义加密与解密程序实例
2014/12/31 PHP
PHP读取Excel内的图片(phpspreadsheet和PHPExcel扩展库)
2019/11/19 PHP
如何实现iframe(嵌入式帧)的自适应高度
2006/07/26 Javascript
js螺旋动画效果的具体实例
2013/11/15 Javascript
XMLHttpRequest处理xml格式的返回数据(示例代码)
2013/11/21 Javascript
下拉列表select 由左边框移动到右边示例
2013/12/04 Javascript
分享一个自己动手写的jQuery分页插件
2014/08/28 Javascript
JS实现按比例缩放图片的方法(附C#版代码)
2015/12/08 Javascript
全面了解构造函数继承关键apply call
2016/07/26 Javascript
Node之简单的前后端交互(实例讲解)
2017/11/14 Javascript
vue实现评论列表功能
2019/10/25 Javascript
jQuery操作选中select下拉框的值代码实例
2020/02/07 jQuery
Vue基于iview实现登录密码的显示与隐藏功能
2020/03/06 Javascript
vue中el-input绑定键盘按键(按键修饰符)
2020/07/22 Javascript
[03:02]2020完美世界城市挑战赛(秋季赛)总决赛回顾
2021/03/11 DOTA
Python入门篇之列表和元组
2014/10/17 Python
Python判断操作系统类型代码分享
2014/11/22 Python
Python的math模块中的常用数学函数整理
2016/02/04 Python
Python基于Socket实现的简单聊天程序示例
2017/08/05 Python
python+selenium打印当前页面的titl和url方法
2018/06/22 Python
详解python的argpare和click模块小结
2019/03/31 Python
Python设置matplotlib.plot的坐标轴刻度间隔以及刻度范围
2019/06/25 Python
python中property和setter装饰器用法
2019/12/19 Python
深入浅析pycharm中 Make available to all projects的含义
2020/09/15 Python
PyCharm 光标变成黑块的解决方式
2021/02/06 Python
Sephora丝芙兰菲律宾官方网站:购买化妆品和护肤品
2017/04/05 全球购物
严选全球尖货,立足香港:Bonpont宝盆
2018/07/24 全球购物
入党积极分子自我批评思想汇报
2014/10/10 职场文书
2014年乡镇安全生产工作总结
2014/12/02 职场文书
售后前台接待岗位职责
2015/04/03 职场文书
Python基础之元编程知识总结
2021/05/23 Python
Elasticsearch 基本查询和组合查询
2022/04/19 Python
MySQL数据库 安全管理
2022/05/06 MySQL
Python 读取千万级数据自动写入 MySQL 数据库
2022/06/28 Python