JS查漏补缺——arguments

简介: JS查漏补缺系列是我在学习JS高级语法时做的笔记,通过实践费曼学习法进一步加深自己对其的理解,也希望别人能通过我的笔记能学习到相关的知识点。这一次我们来了解一下这个现在不推荐使用但在代码中还是会看到的arguments,免得见到的时候摸不着头脑

来自MDN对arguments的解释:

  • arguments 是一个对应于传递给函数的参数的类数组对象。
  • arguments对象是所有(非箭头)函数中都可用的局部变量。你可以使用arguments对象在函数中引用函数的参数
function foo(num1, num2, num3) {
  // 类数组对象中(长的像是一个数组, 本质上是一个对象): arguments
    console.log(arguments) // 1,2,3
}
foo(1,2,3)  

常见的对arguments的操作

  1. arguments.length : 得到本次函数调用时传入函数的实参数量。

arguments.length 表示的是实际上向函数传入了多少个参数,这个数字可以比形参数量大,也可以比形参数量小 (形参数量的值可以通过Function.length获取到).

function foo(num1, num2) {
    console.log(arguments.length)  // 3
}
foo(1,2,3) 
  1. arguments[number] :根据索引值获取某一个参数
function foo(num1, num2) {
    console.log(arguments[2])  // 3
}
foo(1,2,3)
  1. arguments.callee :获取当前arguments所在的函数

callee 是 arguments 对象的一个属性。它可以用于引用该函数的函数体内当前正在执行的函数。这在函数的名称是未知时很有用,例如在没有名称的函数表达式 (也称为“匿名函数”) 内。

function foo(num1, num2) {
    console.log(arguments.callee)
}
foo(1,2,3)

Snipaste_2022-09-05_18-01-03.png

🚨警告:严格模式下,第 5 版 ECMAScript ( ES5) 禁止使用 arguments.callee()。当一个函数必须调用自身的时候,避免使用 arguments.callee(),通过要么给函数表达式一个名字,要么使用一个函数声明。

因为arguments是类数组,它没有 Array的 内置方法, 例如 forEach() map()都是没有的。
所以要将arguments转成array来使用

将arguments转成array的方法

  1. 自己遍历元素然后加进新的数组里面
function foo(num1, num2) {
    var newArr = []
  for (var i = 0; i < arguments.length; i++) {
    newArr.push(arguments[i] * 10)
  }
  console.log(newArr)
}
foo(1,2,3)
  1. Array.prototype.slice 或是[ ]arguments转成array
function foo(num1, num2) {
    var newArr2 = Array.prototype.slice.call(arguments)
  console.log(newArr2)

  var newArr3 = [].slice.call(arguments)
  console.log(newArr3)
}
foo(1,2,3)
🚨 警告: 对参数使用 slice 会阻止某些 JavaScript 引擎中的优化,所以为了提高性能,不推荐使用 slice 来进行数组转换
  1. ES6 的语法
function foo(num1, num2) {
    var newArr4 = Array.from(arguments)
  console.log(newArr4)
  var newArr5 = [...arguments]
  console.log(newArr5)
}
foo(1,2,3)

箭头函数没有arguments

因为箭头函数中没有arguments,如果在箭头函数中输入console.log(arguments),它会去上层函数去找,如果有则输出,没有则报错

🤔如果我们传的实参比形参多,并想要拿到这些额外的参数,该怎么办?
可以使用剩余参数
var foo = (num1, num2, ...args) => {
  console.log(args)
}

foo(1,2,3,4,5)
备注: 如果你编写兼容 ES6 的代码,那么优先推荐使用 剩余参数

剩余参数和arguments对象的区别

  • 剩余参数只包含那些没有对应形参的实参,而 arguments 对象包含了传给函数的所有实参。
// 剩余函数
function foo(num1, num2, ...args) {
  console.log(args)
}

foo(1,2,3,4,5)

// arguments 
function foo(num) {
  console.log(arguments)
}

foo(1,2,3,4,5)

Snipaste_2022-09-05_18-27-40.png

  • arguments对象不是一个真正的数组,而剩余参数是真正的 Array实例,也就是说你能够在它上面直接使用所有的数组方法,比如forEach
  • arguments对象还有一些附加的属性 (如callee属性)。
目录
相关文章
|
3月前
|
存储 JavaScript 对象存储
JS中的arguments是什么?
JS中的arguments是什么?
51 0
JS中的arguments是什么?
|
3月前
|
存储 JavaScript 索引
js arguments 的使用与自执行函数
js arguments 的使用与自执行函数
29 0
|
6月前
|
JavaScript
JS动态参数arguments与剩余参数
JS动态参数arguments与剩余参数
|
存储 JavaScript
JS arguments对象
众所周知,js是一门相当灵活的语言。当我们在js中在调用一个函数的时候,我们经常会给这个函数传递一些参数,js把传入到这个函数的全部参数存储在一个叫做arguments的东西里面
|
11月前
|
JavaScript 前端开发 索引
原生JavaScript之函数特殊对象arguments
原生JavaScript之函数特殊对象arguments
58 0
|
存储 前端开发 JavaScript
javascript内置对象之arguments
javascript内置对象之arguments
55 0
|
存储 JavaScript 前端开发
📕 重学JavaScript:怎么处理arguments这种伪数组?
平时我们写代码的时候,有没有想到过这样的问题:类似于func01(num, name){} 中的 num, name 到底是什么类型的呢?我们该怎么处理它呢?
75 0
|
存储 JavaScript 前端开发
📕 重学JavaScript:函数的入参(arguments)是什么类型?我能怎么使用它?
arguments是一个特殊的对象👏,它可以存储我们给函数传递的所有参数。只不过它的属性从0开始排,依次为0,1,2…最后还有callee和length属性。我们也把这样的对象称为类数组。
98 0
|
JavaScript 算法
js中函数内部属性arguments和this以及方法apply()和call()
js中函数内部属性arguments和this以及方法apply()和call()
|
JavaScript 前端开发
JavaScript中的隐含参数arguments
JavaScript中的隐含参数arguments
79 0