理解参数arguments
- ECMAScript函数不介意传进来的参数个数和类型,
在函数体内可以通过arguments对象来访问这个参数数组
function hi(){
alert("hello"+arguments[0]+","+arguments[1]);
}
hi("kk","jun");// hellokk,jun
- 其实arguments只是与数组类似(并不是Array实例)例如:
function hi(name){
console.log(Array.isArray(arguments));// false
}
hi("name");
将arguments类数组对象转换成数组:Array.prototype.slice.call(arguments)
;
function hi(name){
var args = Array.prototype.slice.call(arguments);
console.log(Array.isArray(args));// true
}
hi("name");
那为什么Array.prototype.slice.call(arguments)能将类数组转换成数组呢?
这篇文章真的赞https://www.cnblogs.com/littledu/archive/2012/05/19/2508672.html
ES6新增实现:Array.from()
function hi(name){
var args = Array.from(arguments);
console.log(Array.isArray(args));// true
}
hi("name");
- 通过访问arguments对象的length属性可以知道有多少个函数传递给了函数
function hi(name){
console.log(arguments.length);
}
hi("name");//1
hi("name","age");//2
根据这个特性可以实现适当的功能,例如:
function add(){
if(arguments.length==1){
do something
}
if(arguments.length==2){
do something
}
}
- 没有传递值的命名参数自动赋值undefined,例如:
function hi(){
console.log(arguments[0]);
}
hi(); //undefined
有意思的题目
- 实现递归
var sum = function(n) {
if(n == 1) {
return 1;
} else {
return n + arguments.callee(n-1);
//calllee,当函数被调用时,它的arguments.callee对象就会指向自身,也就是一个对自己的引用
}
}
console.log("sum =", sum(5));
- 不定参数个数求和
function add() {
//console.log("length", arguments.length);
var len = arguments.length,
sum = 0;
for (var i = 0; i < len; ++i) {
sum += arguments[i];
}
return sum;
};
add(1,2,3,4,5);