Array.prototype.slice.call()方法详解
1 基本介绍
Array.prototype.slice.call()最常用在把实际参数 转成数组的时候;
比如 Array.prototype.slice.call(arguments,0) ;
是把arguments转为数组。
因为arguments并不是真正的数组对象,只是与数组类似而已,所以它并没有slice这个方法,而Array.prototype.slice.call(arguments, 0)
可以理解成是让arguments转换成一个数组对象,让arguments具有slice()方法。要是直接写arguments.slice(0)会报错。
2.真正原理
Array.prototype.slice.call(arguments)
能将具有length属性的对象转成数组,除了IE下的节点集合(因为ie下的dom对象是以com对象的形式实现的,js对象与com对象不能进行转换)
如:
- var a={length:2,0:'first',1:'second'};//类数组,有length属性,长度为2,第0个是first,第1个是second
- console.log(Array.prototype.slice.call(a,0));// ["first", "second"],调用数组的slice(0);
- var a={length:2,0:'first',1:'second'};
- console.log(Array.prototype.slice.call(a,1));//["second"],调用数组的slice(1);
- var a={0:'first',1:'second'};//去掉length属性,返回一个空数组
- console.log(Array.prototype.slice.call(a,0));//[]
- function test(){
- console.log(Array.prototype.slice.call(arguments,0));//["a", "b", "c"],slice(0)
- console.log(Array.prototype.slice.call(arguments,1));//["b", "c"],slice(1)
- }
- test("a","b","c");
3 把参数转为数组的方法总结
方法一:var args = Array.prototype.slice.call(arguments);
方法二:var args = [].slice.call(arguments, 0);
方法三:
- var args = [];
- for (var i = 1; i < arguments.length; i++) {
- args.push(arguments[i]);
- }
最后,附个转成数组的通用函数
- var toArray = function(s){
- try{
- return Array.prototype.slice.call(s);
- } catch(e){
- var arr = [];
- for(var i = 0,len = s.length; i < len; i++){
- //arr.push(s[i]);
- arr[i] = s[i]; //据说这样比push快
- }
- return arr;
- }
- }