arguments对象转化为Array(具有length属性的对象转成数组)

转载 (原文地址) xiaohuangji 随笔 js 820阅读 2014-08-31 17:02:43 举报

Array.prototype.slice.call(arguments,0) 这句里,就是把 arguments 当做当前对象
也就是说 要调用的是 arguments 的slice 方法,后面的 参数 0 也就成了 slice 的第一个参数slice(0)就是获取所有
为什么要这么调用 arguments 的slice 方法呢?就是因为 arguments 不是真的组数,typeof arguments==="Object" 而不是 "Array"

它没有slice这个方法,通过这么Array.prototype.slice.call调用,JS的内部机制应该是 把arguments对象转化为Array

因为Array.prototype.slice.call调用后,返回的是一个组数。

arguments对象转化为Array(具有length属性的对象转成数组)

function mySort( ) {

      var args = new Array(); // 使用数组作为参数存储容器 
      args=args.slice.call(arguments,0).sort(function(a,b){return a-b});
      return args; // 返回已经排序的数组 

    }

补充:
对于apply和call两者在作用上是相同的,但两者在参数上有区别的。
对于第一个参数意义都一样,但对第二个参数:
apply传入的是一个参数数组,也就是将多个参数组合成为一个数组传入,而call则作为call的参数传入(从第二个参数开始)。
如 func.call(func1,var1,var2,var3)对应的apply写法为:func.apply(func1,[var1,var2,var3])

同时使用apply的好处是可以直接将当前函数的arguments对象作为apply的第二个参数传入

拓展:

Array.prototype.slice.call(arguments)能将具有length属性的对象转成数组;

var a={length:3,0:'abc',1:'def',2:'ghi'};
console.log(Array.prototype.slice.call(a));// ["abc", "def",'ghi']
var a={length:0};
console.log(Array.prototype.slice.call(a));// []
var a={length:3};
console.log(Array.prototype.slice.call(a));// [undefined, undefined, undefined]

参考:http://www.cnblogs.com/littledu/archive/2012/05/19/2508672.html

评论 ( 0 )
最新评论
暂无评论

赶紧努力消灭 0 回复