08、arguments

arguments 是一个对应于传递给函数的参数的类数组对象。

arguments对象是所有(非箭头)函数中都可用的局部变量。 你可以使用arguments对象在函数中引用函数的参数。
只有普通函数 里参会有
此对象包含传递给函数的每个参数,第一个参数在索引0处。 例如,如果一个函数传递了三个参数,你可以以如下方式引用他们:

参数也可以被设置:

arguments[1] = 'new value';

arguments对象不是一个 Array 。它类似于Array,但除了length属性和索引元素之外没有任何Array属性。例如,它没有 pop方法。但是它可以被转换为一个真正的Array(数组):

1、call 方法
var args = Array.prototype.slice.call(arguments);
var args = [].slice.call(arguments);

2、对参数使用扩展语法
您还可以使用Array.from()方法或扩展运算符将参数转换为真实数组:
展开运算符
// ES2015
const args = Array.from(arguments);
const args = [...arguments];

属性

  • arguments.callee 指向参数所属的当前执行的函数。 指向调用当前函数的函数。
  • arguments.length 传递给函数的参数数量。
  • arguments[@@iterator] 返回一个新的Array 迭代器 对象,该对象包含参数中每个索引的值。 【迭代器Symbol】

注意:
在严格模式下,arguments对象已与过往不同。
arguments[@@iterator]不再与函数的实际形参之间共享,同时caller属性也被移除。

返回一个新的Array 迭代器 对象,该对象包含参数中每个索引的值。
在函数调用的时候,浏览器每次都会传递进两个隐式参数:

小扩充

在函数调用的时候,浏览器每次都会传递进两个隐式参数:(这里讲的是arguments)

  1. 函数的上下文对象this
  2. 封装实参的对象arguments

下面是一个例子:

function fun(){
    
    
  console.log(arguments);
}
fun('tom',[1,2,3],{
    
    name:'Janny'}); 

可以看到下面打印出来的结果,arguments是有值的,它的值就是我们传递进去的参数,虽然我们没有给fun函数定义形参,但是我们还是可以通过arguments来调用传递给函数fun的实参。

  1. 我们发现callee的值是函数fun,是不是说callee指向函数fun,我们来测试一下
function fun(){
    
    
  // console.log(arguments);
  console.log('arguments.callee === fun的值:',arguments.callee === fun);
}
fun('tom',[1,2,3],{
    
    name:'Janny'});

结果如我们想的一样,callee就是指向函数fun。

  1. 第二个属性length,我们经常在数组或者类数组中看到,可以看到arguments的原型索引__proto__的值为Object,故此我们推测arguments不是数组,而是一个类数组对象。
function fun(){
    
    
  console.log(arguments instanceof Array);
  console.log(Array.isArray(arguments));
}
fun('tom',[1,2,3],{
    
    name:'Janny'});

结果打印出来的值都是false,说明arguments不是数组,而是一个类数组对象。

  1. 第三个属性是个Symbol类型的键,该类型的值都是独一无二的,该键指向的值是一个values函数,

    该值是一个生成迭代器的函数,下面是ES6入门的部分文档。
    
let arr = ['a', 'b', 'c'];
let iter = arr[Symbol.iterator]();
 
iter.next() // {
    
     value: 'a', done: false }
iter.next() // {
    
     value: 'b', done: false }
iter.next() // {
    
     value: 'c', done: false }
iter.next() // {
    
     value: undefined, done: true }
在arguments中有同样的效用。

function fun(){
    
    
  console.log(arguments[Symbol.iterator]);
  let iterator = arguments[Symbol.iterator]();
  console.log('iterator:',iterator);
  console.log(iterator.next());
  console.log(iterator.next());
  console.log(iterator.next());
  console.log(iterator.next());
}
fun('tom',[1,2,3],{
    
    name:'Janny'});

下面是arguments的迭代器枚举的值:
在这里插入图片描述

おすすめ

転載: blog.csdn.net/m0_57349005/article/details/117252672