【前端】arguments,


一 类数组

包含一组数据以及拥有一个 length 属性,但是没有任何 Array 的方法。类数组对象的 length 值无法自动改变。

二 arguments

arguments 是一个类数组对象。代表传给一个function的参数列表。

function printArgs() {
    console.log(arguments);
}
printArgs("A", "a", 0, { foo: "Hello, arguments" });  //["A", "a", 0, Object]

再看看 arguments 表示的内容,其表示了函数执行时传入函数的所有参数。
arguments.length 表示传入的个数

三 arguments操作

1.arguments转数组

  • Array.prototype.slice.call(arguments);
  • [].slice.call(arguments);
  • Array.from()

2.修改 arguments 值

在严格模式下,函数中的参数与 arguments 对象没有联系,修改一个值不会改变另一个值。而在非严格模式下,两个会互相影响。
严格模式下:

function foo(a) {
    "use strict";
    console.log(a, arguments[0]);    //1 1
    a = 10;
    console.log(a, arguments[0]);    //10 1
    arguments[0] = 20;
    console.log(a, arguments[0]);    //10 20
}
foo(1);

非严格模式下:

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

3.将参数从一个函数传递到另一个函数

function foo() {
    bar.apply(this, arguments);
}
function bar(a, b, c) {
    // logic
}

4. 扩展操作符

扩展操作符可以将 arguments 展开成独立的参数。

function func() {
    console.log(...arguments);
}

func(1, 2, 3); // 1 2 3

5. 默认参数

默认参数对 arguments 没有影响

function func(firstArg = 0, secondArg = 1) {
    console.log(arguments[0], arguments[1]);  // 99 undefined
    console.log(firstArg, secondArg);         // 99 1
}
func(99);

四 注意事项

1.JS没有重载

function add(num1, num2) {
    console.log("Method one");
    return num1 + num2;
}

function add(num1, num2, num3) {
    console.log("Method two");
    return num1 + num2 + num3;
}

add(1, 2);   // Method two
add(1, 2, 3); // Method two

2.不能将函数的 arguments 泄露或者传递出去

将函数的 arguments 对象泄露出去了,最终的结果就是 V8 引擎将会跳过优化,导致相当大的性能损失。
下面的例子就是把arguments泄漏了:

// Leaking arguments example2:
function getArgs() {
    const args = [].slice.call(arguments);
    return args;
}

我们可以这么做:

function getArgs() {
    const args = new Array(arguments.length);
    for(let i = 0; i < args.length; ++i) {
        args[i] = arguments[i];
    }
    return args;
}

相关内容

    暂无相关文章