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
一般使用下面的方法來將 arguments 轉換成數組:數組
Array.prototype.slice.call(arguments);
[].slice.call(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; }
// 修改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