实际参数在函数中咱们可使用 arguments 对象得到 (注:形参可经过 arguments.callee 得到),虽然 arguments 对象与数组形似,但仍不是真正意义上的数组。数组
咱们能够经过数组的 slice 方法将 arguments 对象转换成真正的数组。函数
Array.prototype
属性调用slice
方法var args = Array.prototype.slice.call(arguments);
Array 自己是没有 slice 方法,它的方法在 Array.prototype中,而咱们在调用 slice 方法的时候,若是在 Array 自己没有找到 slice 方法的话,会经过它的原型链往上查找。prototype
[]
的slice方法var args = [].slice.call(arguments, 0);
function toArray(){ var args = []; for (var i = 1; i < arguments.length; i++) { args.push(arguments[i]); } return args; }
注:通常的函数的 arguments.length 都在 10 之内,方法二有优点;
方法二的代码量上也比第一种少,至少能够减少一点字节code
实例:对象
function revse(){ try{ return Array.prototype.slice.call(arguments); } catch(e){ var newarr=[]; for(var i=arguments.length-1;i>=0;i--){ //newarr.push(arguments[i]); newarr[i] = arguments[i]; //这样比push快? } return newarr; } } var s = revse('a','b','c'); console.log(s); //["a", "b", "c"]
跟arguments问题相关题目
在某些场景下,须要将函数的 arguments 参数做为一个数组调用,可是 arguments 是一个奇异对象,因此试着将 arguments 转化为一个数组,例以下面例子:原型链
function argToArr(){ return [].slice.call(arguments, 0); } console.log(argToArr(1,2,3)); //[1,2,3] function argToArr(){ return Array.slice.call(arguments, 0); } console.log(argToArr(1,2,3)); //Uncaught TypeError: Cannot read property 'call' of undefined
这是为何呢?
第二段代码报错是由于Array是构造函数,不是对象,打开控制台,输入 typeof Array
,结果是 function
。slice()
方法在其原型对象中,而[]
就是Arra
y的原型对象,在控制台中输入 Array.prototype
,结果是[]
,因此第一段代码能够顺利执行。原型
第二段代码以下修改就能够了:io
function argToArr(){ return Array.prototype.slice.call(arguments, 0); // 改这一行 } console.log(argToArr(1,2,3));