设为首页|收藏本页| 会员登录|会员注册|繁体中文
今天是:
您现在的位置: 清怡网苑 >> 文章中心 >> 网页设计 >> Ajax >> 文章正文
Array.prototype.slice.apply 使用技巧
作者:佚名    文章来源:互联网    更新时间:2007-12-25 21:09:24

  看如下代码: 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 来处理的情形,这个技巧可以帮上忙。 

这个技巧来自鼎鼎大名的 Douglas Crockford。推而广之, 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 则都能得到正确的结果。 

Prototype 1.4 中增加的 $A() 方法也常用来将 arguments 转为数组,我们看它的实现:  

var $A = Array.from = function(iterable) { 
  if (!iterable) return []; 
  if (iterable.toArray) { 
    return iterable.toArray(); 
  } else { 
    var results = []; 
    for (var i = 0; i < iterable.length; i++) 
      results.push(iterable[i]); 
    return results; 
  } 

Prototype 用一个for循环来构造新数组,这样是为了保证最大限度的兼容性。

文章录入:admin    责任编辑:admin 
相关文档】 【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
  • 没有相关文章
  •   网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    更多>>
    编辑推荐
  • 此栏目下没有推荐文章
  • 更多>>
    博客聚合
  • 此栏目下没有文章
  • 更多>>
    故障答疑