arguments的介紹(一)

arguments 是一個類數組對象。表明傳給一個function的參數列表。

1.1 arguments length

arguments 是個類數組對象,其包含一個 length 屬性,能夠用 arguments.length 來得到傳入函數的參數個數。javascript

 

function func() {
    console.log("The number of parameters is " + arguments.length);
}

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

執行結果以下:java

The number of parameters is 0
The number of parameters is 2
The number of parameters is 3

1.2 arguments 轉數組

一般使用下面的方法來將 arguments 轉換成數組:數組

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

1.3 leaking arguments

另外,有一個須要注意的地方就是,不能將函數的 arguments 泄露或者傳遞出去。什麼意思呢?看下面的幾個泄露 arguments 的例子:函數

 

// Leaking arguments example1:
function getArgs() {
    return arguments;
}

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

// Leaking arguments example3:
function getArgs() {
    const args = arguments;
    return function() {
        return args;
    };
}

上面的作法就直接將函數的 arguments 對象泄露出去了,最終的結果就是 V8 引擎將會跳過優化,致使至關大的性能損失。性能

能夠這樣作:優化

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

1.4 修改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 bar(a) {
       console.log('-----非嚴格模式下的值變化------')
        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
    }
    bar(1);

從上面的兩個例子中能夠看出,在嚴格模式下,函數中的參數與 arguments 對象沒有聯繫,修改一個值不會改變另外一個值。而在非嚴格模式下,兩個會互相影響。spa

相關文章
相關標籤/搜索