arguments

一个类数组对象,会将调用函数时传递的所有参数储存于arguments

  1. function foo(a,b){
  2. console.log(arguments)
  3. }
  4. foo(1,2,3,4)
  5. /*
  6. Arguments(4) [1, 2, 3, 4, callee: ƒ, Symbol(Symbol.iterator): ƒ]
  7. */

常见操作

arguments.length

获取arguments对象长度

arguments[i]

通过索引值获取参数

arguments.callee

获取当前arguments所在函数

  1. function foo(){
  2. // 无限循环递归调用
  3. arguments.callee()
  4. }
  5. foo();

类数组对象转数组

原生遍历对象元素生成数组

  1. function foo(){
  2. var arr=[]
  3. for(let i=0;i<arguments.length;i++){
  4. arr.push(arguments[i]);
  5. }
  6. console.log(arr);
  7. }

Array.prototype.slice.call()

  1. /*
  2. 对arguments使用 slice 会阻止某些 JavaScript 引擎中的优化(比如V8)
  3. 不如更推荐通过遍历构建新数组
  4. */
  5. function foo(){
  6. var arr=
  7. Array.prototype.slice.call(arguments);
  8. console.log(arr);
  9. }

Array.from()

  1. /* ES6新增方法 */
  2. function foo(){
  3. var arr=Array.from(arguments);
  4. console.log(arr);
  5. }

...扩展运算符

  1. /* ES6新增语法 */
  2. function foo(){
  3. var arr=[...arguments];
  4. console.log(arr);
  5. }

箭头函数的aruguments

箭头函数中无原型对象,同时也没有arguments对象,因此如果在箭头函数中调用会通过作用域链在上层作用域中寻找。

全局作用域的arguments

浏览器:window对象中无arguments属性

Node:全局作用域存在arguments属性,因为Node会讲各js文件当模块执行

ES6的arguments

ES6由于箭头函数的引入,更推荐使用剩余参数方法代替arguments

  1. const foo=(a,...args)=>{
  2. console.log(args);
  3. }