JavaScript中的arguments詳解

1. arguments

  • arguments不是真正的數組,它是一個實參對象,每一個實參對象都包含以數字爲索引的一組元素以及length屬性。數組

    (function () {
          console.log(arguments instanceof Array); // false  
          console.log(typeof (arguments)); // object  
      })();
  • 只有函數被調用時,arguments對象纔會建立,未調用時其值爲null函數

    console.log(new Function().arguments);  // null
  • JavaScript函數調用不對參數作任何檢查。
  • 當調用函數的時候傳入的實參比形參個數少時,剩下的形參都被設置爲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"]
  • 當調用函數傳入的參數比形參個數多時,經過標識符arguments能夠得到未命名的引用。

驗證明參的個數對象

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屬性,callee屬性指代正在執行的函數,caller指代調用當前正在執行的函數的函數
  • arguments 的完整語法以下:
    [function.]arguments[n]
    function :當前正在執行的 Function 對象的名字。
    n :要傳遞給 Function 對象的從0開始的參數值索引。

查看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

參考資料

相關文章
相關標籤/搜索