arguments不是真正的數組,它是一個實參對象,每一個實參對象都包含以數字爲索引的一組元素以及length屬性。數組
(function () { console.log(arguments instanceof Array); // false console.log(typeof (arguments)); // object })();
只有函數被調用時,arguments對象纔會建立,未調用時其值爲null函數
console.log(new Function().arguments); // null
當調用函數的時候傳入的實參比形參個數少時,剩下的形參都被設置爲undefined。.net
給被省略的參數賦值:code
function getPropertyNames(o, /* optional */ a) { a = a || []; // 等於 if(a == undefined) a = []; for (var property in o) { a.push(property); } return a; } console.log(getPropertyNames({ '1': 'a', '2': 'b' })); // ["1", "2"] console.log(getPropertyNames({ '1': 'a', '2': 'b' }, ['3'])); // ["3", "1", "2"]
驗證明參的個數對象
function f(x, y, z) { // 首先,驗證傳入實參的個數是否正確 if (arguments.length != 3) { throw new Error("function f called with " + arguments.length + "arguments, but it expects 3 arguments."); } // 再執行函數的其餘邏輯 } f(1, 2); // Uncaught Error: function f called with 2arguments, but it expects 3 arguments.
查看實參和形參的個數是否一致blog
// 查看實參和形參的個數是否一致 function add(a, b) { var realLen = arguments.length; console.log("realLen:", arguments.length); // realLen: 5 var len = add.length; console.log("len:", add.length); // len: 2 if (realLen == len) { console.log('實參和形參個數一致'); } else { console.log('實參和形參個數不一致'); } }; add(1, 2, 3, 6, 8);
模擬函數重載遞歸
function doAdd() { if (arguments.length == 1) { console.log(arguments[0] + 5); } else if (arguments.length == 2) { console.log(arguments[0] + arguments[1]); } }
接受任意數量的實參,並返回其中的最大值索引
function max(/* ... */) { var max = Number.NEGATIVE_INFINITY; // 遍歷實參,查找並記住最大值 for (var i = 0; i < arguments.length; i++) { if (arguments[i] > max) { max = arguments[i]; } } // 返回最大值 return max; } console.log(max(1, 10, 110, 2, 3, 5, 10000, 100)); // 10000
自動更新ip
function f(x) { console.log(x); // 1,輸出實參的初始值 arguments[0] = null; // 修改實參數組的元素一樣會修改x的值 console.log(x); // null x = 'a'; // 修改x的值一樣會修改實參數組的元素 console.log(arguments[0]); // a } f(1);
查看callee和caller屬性get
function a() { console.log('a...'); b(); } function b() { console.log('b...'); console.log(b.arguments.callee); console.log(b.caller); } a();
經過callee實現遞歸調用自身
var factorial = function (x) { if (x <= 1) { return 1; } return x * arguments.callee(x - 1); } console.log(factorial(5)); // 120