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实现简单二级下拉菜单实例
Jun 15 Javascript
node.js中的http.response.addTrailers方法使用说明
Dec 14 Javascript
深入浅析javascript立即执行函数
Oct 23 Javascript
jquery实现两边飘浮可关闭的对联广告
Nov 27 Javascript
EasyUI布局 高度自适应
Jun 04 Javascript
基于js实现的限制文本框只可以输入数字
Dec 05 Javascript
javascript和php使用ajax通信传递JSON的实例
Aug 21 Javascript
详解如何webpack使用DllPlugin
Sep 30 Javascript
微信小程序合法域名配置方法
May 06 Javascript
jQuery实现中奖播报功能(让文本滚动起来) 简单设置数值即可
Mar 20 jQuery
vue总线机制(bus)知识点详解
May 10 Javascript
解决vue组件没显示,没起作用,没报错,但该显示的组件没显示问题
Sep 02 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版(5)
2006/10/09 PHP
php 不同编码下的字符串长度区分
2009/09/26 PHP
php从右向左/从左向右截取字符串的实现方法
2011/11/28 PHP
PHP采集类Snoopy抓取图片实例
2014/06/19 PHP
PHP面向对象详解(三)
2015/12/07 PHP
PHP简单实现DES加密解密的方法
2016/07/12 PHP
php 获取xml接口数据的处理方法
2018/05/31 PHP
基于Jquery的仿Windows Aero弹出窗(漂亮的关闭按钮)
2010/09/28 Javascript
基于jquery的simpleValidate简易验证插件
2014/01/31 Javascript
在JavaScript中操作时间之getUTCDate()方法的使用
2015/06/10 Javascript
javascript+canvas实现刮刮卡抽奖效果
2015/07/29 Javascript
JavaScript驾驭网页-获取网页元素
2016/03/24 Javascript
JavaScript事件方法(实例讲解)
2017/06/27 Javascript
JS中通过url动态获取图片大小的方法小结(两种方法)
2018/10/31 Javascript
浅谈Vue.js中如何实现自定义下拉菜单指令
2019/01/06 Javascript
jQuery实现表格的增、删、改操作示例
2019/01/27 jQuery
前端js中的事件循环eventloop机制详解
2019/05/15 Javascript
layui给下拉框、按钮状态、时间赋初始值的方法
2019/09/10 Javascript
JavaScript Window窗口对象属性和使用方法
2020/01/19 Javascript
antd配置config-overrides.js文件的操作
2020/10/31 Javascript
python爬虫之urllib,伪装,超时设置,异常处理的方法
2018/12/19 Python
Linux下Pycharm、Anaconda环境配置及使用踩坑
2018/12/19 Python
对pyqt5之menu和action的使用详解
2019/06/20 Python
Python二次规划和线性规划使用实例
2019/12/09 Python
python默认参数调用方法解析
2020/02/09 Python
python实现银行实战系统
2020/02/26 Python
python 使用多线程创建一个Buffer缓存器的实现思路
2020/07/02 Python
Python中的特殊方法以及应用详解
2020/09/20 Python
一个大学生十年的职业规划
2014/01/17 职场文书
致1500米运动员广播稿
2014/02/07 职场文书
诚信考试标语
2014/06/24 职场文书
农村党员对照检查材料
2014/09/24 职场文书
超搞笑婚前保证书
2015/05/08 职场文书
师范生小学见习总结
2015/06/23 职场文书
小学生节约用水倡议书
2019/08/12 职场文书
教你如何让spark sql写mysql的时候支持update操作
2022/02/15 MySQL