我是靠谱客的博主 缓慢心情,最近开发中收集的这篇文章主要介绍MDN的arguments详解【总结】,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一、MDN的arguments详解

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

语法

arguments

描述

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

arguments[0]
arguments[1]
arguments[2]

参数也可以被设置:

arguments[1] = 'new value';

arguments对象不是一个 Array 。它类似于Array,但除了length属性和索引元素之外没有任何Array属性。例如,它没有 pop 方法。

比如以下实例,对arguments对象的使用:

method方法打印的this为obj对象;fn方法打印的this为arguments对象。

var length = 10;
function fn() {
    console.log(this);
};
var obj = {
    length: 5, 
    method: function (fn) {
        console.log(this);
        arguments[0]();
    }
};
obj.method(fn, 1);

但是它可以被转换为一个真正的Array

var args = Array.prototype.slice.call(arguments);
var args = [].slice.call(arguments);

// ES2015
const args = Array.from(arguments);
const args = [...arguments];

对参数使用slice会阻止某些JavaScript引擎中的优化 (比如 V8 - 更多信息)。如果你关心性能,尝试通过遍历arguments对象来构造一个新的数组。另一种方法是使用被忽视的Array构造函数作为一个函数:

var args = (arguments.length === 1 ? [arguments[0]] : Array.apply(null, arguments));

如果调用的参数多于正式声明接受的参数,则可以使用arguments对象。这种技术对于可以传递可变数量的参数的函数很有用。使用 arguments.length来确定传递给函数参数的个数,然后使用arguments对象来处理每个参数。要确定函数签名中(输入)参数的数量,请使用Function.length属性。

对参数使用 typeof

typeof参数返回 'object'。

console.log(typeof arguments);    // 'object'
// arguments 对象只能在函数内使用
function test(a){
    console.log(a,Object.prototype.toString.call(arguments));
    console.log(arguments[0],arguments[1]);
    console.log(typeof arguments[0]);
}
test(1);
/*
1 "[object Arguments]"
1 undefined
number
*/

可以使用索引确定单个参数的类型。

console.log(typeof arguments[0]); //this will return the typeof individual arguments.

对参数使用扩展语法

您还可以使用Array.from()方法或扩展运算符将参数转换为真实数组:

var args = Array.from(arguments);
var args = [...arguments];

属性

arguments.callee

指向当前执行的函数。

arguments.caller 

指向调用当前函数的函数。

arguments.length

指向传递给当前函数的参数数量。

arguments[@@iterator]

返回一个新的Array迭代器对象,该对象包含参数中每个索引的值。

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

ES6的剩余参数、默认参数和解构赋值参数

剩余参数:用剩余形参y来接收过多的实参。

例如:x值1,y值为数组[2,3,4]

        function func(x,...y){
            console.log(x);
            console.log(y);
        }
        func(1,2,3,4);

默认参数:如果函数没有传入给形参值(对应形参为实参),那么该形参就会取默认值。(切记:arguments只与实参对应)

例如:x的值为1,y的值为5

function func(x,y=5){
            console.log(x);
            console.log(y);
        }
        func(1);

结构赋值:

列如:x的值为1,y值为2

        function func(x,y){
            console.log(x);
            console.log(y);
        }
        var arr = [1,2]
        func(...arr);

arguments对象可以与剩余参数、默认参数和解构赋值参数结合使用。

function foo(...args) {
  return args;
}
foo(1, 2, 3);  // [1,2,3]

 

当非严格模式中的函数没有包含剩余参数、默认参数和解构赋值,那么arguments对象中的值跟踪参数的值(反之亦然)。看下面的代码:

function func(a) { 
  arguments[0] = 99;   // 更新了arguments[0] 同样更新了a
  console.log(a);
}
func(10); // 99

并且

function func(a) { 
  a = 99;              // 更新了a 同样更新了arguments[0] 
  console.log(arguments[0]);
}
func(10); // 99

当非严格模式中的函数包含剩余参数、默认参数和解构赋值,那么arguments对象中的值不会跟踪参数的值(反之亦然)。相反, arguments反映了调用时提供的参数:

function func(a = 55) { 
  arguments[0] = 99; // updating arguments[0] does not also update a
  console.log(a);
}
func(10); // 10

并且

function func(a = 55) { 
  a = 99; // updating a does not also update arguments[0]
  console.log(arguments[0]);
}
func(10); // 10

并且

function func(a = 55) { 
  console.log(arguments[0]);
}
func(); // undefined

【总结】

一、非严格模式下的特性

1、arguments对象与实参映射,通过arguments可以修改实参的值,反之亦然。

2、arguments.callee执行函数体;

3、函数的caller指向该函数的父级函数,arguments.callee.caller。需要注意的是,如果在全局作用域中调用当前函数,它的值null。

        function fatherFunc() {
            console.log(arguments.callee.caller);//fatherFunc在全局中调用,该值为null
            function func(x) {
                console.log(arguments.callee.caller)//打印fatherFunc
            }
            func(1);
        }

        fatherFunc();

4、必须有实参的传入,arguments只与实参建立联系。

实例1:x与arguments[0]无联系

function fn(x){
   x = 10;
   arguments[0] = 20;
   console.log(x,arguments[0]); //x = 10; arguments[0] = 20;
}
 fn();
 console.log(window.x);// undefined
 console.log(x);// x is not defined

实例2:x与arguments[0]无联系

 function fn(x){
        arguments[0] = 20;
        console.log(x,arguments[0])
    }
    fn();
    // undefined  和 20

 实例3:建立联系

function fn(x){
        x = 10;                      
        arguments[0] = 20;
        console.log(x,arguments[0]); // 20 20
    }
    fn(1);

二、严格模式下的特性

1、arguments对象和实参的修改,已经互不影响,即,在实参传入到函数中时,arguments的值与其相等,后续对arguments或对实参的修改,两者互不影响。

2、禁止使用arguments.callee和arguments.callee.caller函数的caller值。

'caller', 'callee', and 'arguments' properties may not be accessed on strict mode functions

三、ES6下的特性

默认参数、剩余参数、结构赋值,会使函数的arguments也不再与实参相互影响。

最后

以上就是缓慢心情为你收集整理的MDN的arguments详解【总结】的全部内容,希望文章能够帮你解决MDN的arguments详解【总结】所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(40)

评论列表共有 0 条评论

立即
投稿
返回
顶部