arguments
一个类数组对象,会将调用函数时传递的所有参数储存于arguments中
function foo(a,b){console.log(arguments)}foo(1,2,3,4)/*Arguments(4) [1, 2, 3, 4, callee: ƒ, Symbol(Symbol.iterator): ƒ]*/
常见操作
arguments.length
获取arguments对象长度
arguments[i]
通过索引值获取参数
arguments.callee
获取当前arguments所在函数
function foo(){// 无限循环递归调用arguments.callee()}foo();
类数组对象转数组
原生遍历对象元素生成数组
function foo(){var arr=[]for(let i=0;i<arguments.length;i++){arr.push(arguments[i]);}console.log(arr);}
Array.prototype.slice.call()
/*对arguments使用 slice 会阻止某些 JavaScript 引擎中的优化(比如V8)不如更推荐通过遍历构建新数组*/function foo(){var arr=Array.prototype.slice.call(arguments);console.log(arr);}
Array.from()
/* ES6新增方法 */function foo(){var arr=Array.from(arguments);console.log(arr);}
...扩展运算符
/* ES6新增语法 */function foo(){var arr=[...arguments];console.log(arr);}
箭头函数的aruguments
箭头函数中无原型对象,同时也没有arguments对象,因此如果在箭头函数中调用会通过作用域链在上层作用域中寻找。
全局作用域的
arguments浏览器:window对象中无
arguments属性Node:全局作用域存在
arguments属性,因为Node会讲各js文件当模块执行ES6的
argumentsES6由于箭头函数的引入,更推荐使用
剩余参数方法代替arguments
const foo=(a,...args)=>{console.log(args);}
