Array.prototype.slice.apply使用技巧

看如下代码:

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) {   return iterable.toArray();  } else {   var results = [];   for(var i=0; i<iterable.length; i++)   results.push(iterable[i]);   return results;  } }

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

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索数组
, 对象
, array
, prototype
, 一个
, arguments
, Array对象
, [转]prototype
, slice函数
, 关于arguments
apply数组
prototype.slice.call、prototype.slice、slice.apply、prototype.apply、js prototype apply,以便于您获取更多的相关知识。

时间: 2024-11-16 06:38:08

Array.prototype.slice.apply使用技巧的相关文章

Array.prototype.slice.apply的使用方法_javascript技巧

复制代码 代码如下: function test(){ //将参数转为一个数组 var args = Array.prototype.slice.apply(arguments); alert(args); } arguments在JavaScript语法中是函数特有的一个对象属性(Arguments对象),用来引用调用该函数时传递的实际参数.这个对象很象数组,拥有length属性且使用下标的形式来获取其元素,但它又并非真正的Array对象.更多关于Arguments对象的资料请参阅<JavaS

浅谈javascript的Array.prototype.slice.call_javascript技巧

写字前面 在js中我们经常会看到Array.prototype.slice.call(arguments,0)的写法,当然,这个方法的作用也许大家都明白,那就是把类数组对象转换成一个真正的数组.关于这个方法,我说说自己的理解. 这里涉及到slice()方法和call()方法,所以先简单说说这两个方法. slice()方法 数组和字符串都有这个slice方法,这个方法的作用是截取一段数据.它接收两个参数,第一个参数是要截取的位置索引,第二参数可选,表示要截取到的结束位置,但是不包括结束位置.在数组

Array.prototype.slice 使用扩展_javascript技巧

除了正常用法,slice 经常用来将 array-like 对象转换为 true array. 名词解释:array-like object – 拥有 length 属性的对象,比如 { 0: 'foo', length: 1 }, 甚至 { length: 'bar' }. 最常见的 array-like 对象是 arguments 和 NodeList. 查看 V8 引擎 array.js 的源码,可以将 slice 的内部实现简化为: 复制代码 代码如下: function slice(s

js利用prototype调用Array的slice方法示例_javascript技巧

复制代码 代码如下: <script type="text/javascript"> function fn(name){ if(typeof name === "string"){ var args = Array.prototype.slice.call( arguments, 1 ); for(var i=0;i<args.length;i++){ alert(args[i]);//结果: 111 222 } } } function cal

Array.prototype 的泛型应用分析_javascript技巧

题目 请说明下面语句的输出: 复制代码 代码如下: x = {shift:[].shift}; x.shift(); console.info(x.length); 如果你回答正确,那么说明你已经了解 Array 函数的泛型应用.在理解这到题目之前,我 我们首先要了解数组(Array)的 shift 定义. MDC 中已经对相关的说明描述得非常的清楚 复制代码 代码如下: shift is intentionally generic; this method can be called or a

javascript Array对象使用小结_javascript技巧

Javascript的数组实质是对象,它把数组的下标转换成字符串,用其作为属性,因此它明显比真正的数组慢,但它可以更方便地使用. 改变自身pop,push,reverse,shift,sort,splice,unshift, 不改变自身concat,join,slice,indexOf,lastIndexOf(后两个为1.6),1.6新增的迭代器:map,filter,forEach,every,some,1.8新增reduce,reduceRight Array 对象的方法 FF: Firef

JavaScript中Array的一些实用操作技巧

最近在调试JSP页面时频繁与ajax打交道,在复杂场景下,ajax传参数就需要对大量参数进行处理.这时我才发现,熟练Array的处理真的会使开发轻松不少!! 关于Array Array的创建很灵活,可以使用Array构造函数,也可以直接创建数组"字面量". var arr = new Array();  //[]  var brr = Array();      //[] 两者等效    var arr = Array(3);    //[]  arr.length;         

全面了解构造函数继承关键apply call_javascript技巧

主要我是要解决一下几个问题:  1.  apply和call的区别在哪里  2.  apply的其他巧妙用法(一般在什么情况下可以使用apply) 我首先从网上查到关于apply和call的定义,然后用示例来解释这两个方法的意思和如何去用. apply:方法能劫持另外一个对象的方法,继承另外一个对象的属性. Function.apply(obj,args)方法能接收两个参数 obj:这个对象将代替Function类里this对象 args:这个是数组,它将作为参数传给Function(args-

Array.prototype.concat不是通用方法反驳[译]_javascript技巧

ECMAScript 5.1规范§15.4.4.4 中说到: 复制代码 代码如下: concat函数是有意设计成通用的;它并不要求它的this值必须得是个Array对象.因此,它可以被转移到其它类型的对象上作为方法来调用. 本文中的代码都使用了[]来作为Array.prototype的快捷方式.这已经是很常用的技巧了,虽然可读性差点:你通过一个对象实例访问到了Array.prototype上的方法.但是,这样的访问方式在现代的JavaScript引擎中非常之快,以至于我怀疑,说不定在这种调用方式