1.每个函数都有一个arguments属性,表示函数的实参集合。
2.arguments不是数组而是一个对象,但它和数组很相似,所以通常称为类数组对象,以后看到类数组其实就表示arguments。
arguments对象不是一个 Array 。它类似于Array,但除了length属性和索引元素之外没有任何Array属性。例如,它没有 pop 方法。但是它可以被转换为一个真正的Array:
var args = Array.prototype.slice.call(arguments);
var args = [].slice.call(arguments);
// ES2015
const args = Array.from(arguments);
const args = [...arguments];
3.arguments有length属性,可以用arguments[length]显示调用:
function func(){
for(var i=0;i<arguments.length;i++){
alert(typeof(arguments))//object
console.log(arguments[i]);
}
}
func("a",17,[1,2,3],{name:"javascript",type:"language"});
/*
a
17
[1, 2, 3]
{name: "javascript", type: "language"}
*/
4.Array.prototype.slice.call(arguments)
function useArguments() {
var arr=Array.prototype.slice.call(arguments)//把arguments类数组转化为数组
return eval(arr.join("+"));//求和
}
arguments不是真正的数组,不能直接使用slice方法,所以才会用Array对象原型链上面的slice方法去截取arguments,返回的自然是一个数组。我们看看来call是干啥的
var obj1={
name:"java"
}
window.name="javascript";
var func=function(){
console.log(this.name);
}
func(); //javasript
func.call(obj1); //java
可以很清楚的看到,call的一个作用是可以改变函数运行的作用域,func中的this指向了obj1,所以Array.prototype.slice是一个方法,将它call(arguments)之后,Array.prototype.slice中的this就指向了arguments对象了。
注意当的调用参数为函数的第一个参数之后的全部参数,可以这样写:
var args = Array.prototype.slice.call(arguments,1);
你这句可以分两步,先赋予arguments数组的slice方法,再进一步调用,像这样:
var trueArray=Array.prototype.slice.call(arguments);//让arguments具有数组的slice方法
var args=trueArray.slice(1);