(一).Array.prototype.slice.call(arguments);
- slice(start, end) 方法可提取数组的某个部分,并返回新的数组
//在数组中读取元素:
var fruits = ["Banana", "Orange", "Lemon", "Apple", "Mango"];
var citrus = fruits.slice(1,3); // [) 左闭右开区间
citrus 结果输出:
["Orange", "Lemon"]
- call()函数用于调用当前函数function,并可同时使用指定对象obj作为本次执行时function函数内部的this指针引用。
var obj = {name: "wendy", age: 20};
function fun(a, b){
console.log(this.name);
console.log(a);
console.log(b);
}
// 改变this引用为obj,同时传递两个参数
fun.call(obj, 12, true); // 李四 12 true
var args = [].slice.call(arguments, 0);
arguments是一个对象而不是数组,最多算是一个伪数组,而且自身的原型链上也没有slice这个方法。
3. []自身也是也是一个对象.而数组原型链上有这个slice这个方法。
/*此处的返回值是true*/
[].slice === Array.prototype.slice;
通过call显式绑定来实现arguments变相有slice这个方法
引用hanyuntao的Array.prototype.slice.call()的分享
(二).将函数的实际参数转换成数组的方法
方法一: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语句允许我们定义在执行时进行错误测试的代码块。
//catch 语句允许我们定义当 try 代码块发生错误时,所执行的代码块。
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;
}
}