在学习转化之前,我们要知道什么是类数组:
一个拥有 length 属性和若干索引属性的对象就可以被称为类数组对象
常见的类数组对象有 arguments 和 DOM 方法的返回结果,还有一个函数也可以被看作是类数组对象
举一个栗子:
var array = ['boy','love','q'];
var arrayLink = {'1':'boy','2':'love','4':'q',length:5};
Array.prototype.join.call(arrayLink,'+');//'+bou+love++q'
Arguments 对象只定义在函数体中,包括了函数的参数和其他属性。
function foo(name, age, sex) {
console.log(arguments);
}
foo('name', 'age', 'sex')
我们可以看到这里还有一个callee属性:
该属性是一个指针,指向拥有这个 arguments 对象的函数
function factorial(num){
if (num <=1) {
return 1;
} else {
return num * factorial(num-1)
}
}
//使用callee可以消除上面这种耦合 (函数执行和函数名的耦合)
function factorial1(num){
if (num <=1) {
return 1;
} else {
return num * arguments.callee(num-1);
}
}
现在很少使用arguments.callee();
原因:访问 arguments 是个很昂贵的操作,因为它是个很大的对象,每次递归调用时都需要重新创建。影响现代浏览器的性能,还会影响闭包。
那么如何将类数组转化为数组呢?
- 通过 call 调用数组的 slice 方法来实现转换
Array.prototype.slice.call(arrayLike);
- 通过 call 调用数组的 splice 方法来实现转换
Array.prototype.splice.call(arrayLike, 0);
- 通过 apply 调用数组的concat 方法来实现转换
Array.prototype.concat.apply([], arrayLike);
- 通过 Array.from 方法来实现转换
Array.from(arrayLike);