平時編寫js代碼對arguments接觸的可能不是很多,但是了解arguments卻是很有必要的。
例如,需要編寫一個函數求傳入的若幹個數字(不能用數組顯示傳入)的和,
這時候就需要用到arguments了。
要實作這個函數我們先來了解下arguments:
具體可參考http://www.w3school.com.cn/js/pro_js_functions_arguments_object.asp
在Javascript中arguments是一個類似Array的存在,但它不能等同于Array。
arguments對象不能顯式的建立,它隻有在函數開始時才可用。
它可以像通路數組那樣去通路每一個子元素。.
PS:arguments[0],arguments[1],。。。。。。。。arguments[n];
Javascript并沒有重載函數的功能,但是通過Arguments對象能夠模拟重載。
Javascript的每個函數都會有一個Arguments對象執行個體arguments,它引用着函數的實參,它也有類似于數組的length屬性。
(1)、arguments.length 為函數實參個數。
(2)、arguments.callee 引用函數自身。
1、我們可以借用arguments.length可以來檢視實參和形參的個數是否一緻:
function add(a, b) {
var realLen = arguments.length;
console.log("realLen:", arguments.length);
var len = add.length;
console.log("len:", add.length);
if (realLen == len) {
console.log('實參和形參個數一緻');
} else {
console.log('實參和形參個數不一緻');
}
};
add(1,2,3,6,8);
2、我們可以借用 arguments.callee來讓匿名函數實作遞歸:
var sum = function(n) {
if(n == 1) {
return 1;
} else {
return n + arguments.callee(n-1);
}
}
console.log("sum =", sum(5));
好了現在讓我們來實作文章開頭提到的那個函數(求傳入的若幹個數字(不能用數組顯示傳入)的和)。
1、借用arguments.length屬性來實作
function add() {
//console.log("length", arguments.length);
var len = arguments.length;
var sum = 0;
for (var i = 0; i < len; ++i) {
sum += arguments[i];
}
return sum;
};
add(1,2,3,6,8);
2、借用prototype屬性來實作:
function add() {
return Array.prototype.reduce.call(arguments, function(n1, n2) {
return n1 + n2;
});
};
add(1,2,3,6,8);