其它面向?qū)ο笳Z言如Java的一個常見特性是:能夠根據(jù)傳入的不同數(shù)量量或類型的參數(shù),通過“重載”函數(shù)來發(fā)揮不同的功用。但是這個特性在Javascript中并沒有被直接支持,可是有很多辦法實現(xiàn)這一功能。
< JS嚴格上沒有函數(shù)重載的,但是可以使用arguments和實參的類型進行模擬 >
arguments案例: 任意數(shù)求和
function sum() {
var total = null;
for (var i=0,len=arguments.length;i<len;i++) {
var cur = Number(arguments[i]);
if (!isNaN(cur) {
total += cur;
}
}
return total;
};
sum(1, 2, 3); //--->> 6
sum(1, '10'); // --->> 11
核心:
- 1 參數(shù)的個數(shù)( (arguments對象的使用)
- 2 參數(shù)的類型 (typeof檢測數(shù)據(jù)類型的使用)
argument: 函數(shù)內(nèi)部的一個對象,用來接收函數(shù)執(zhí)行所傳入實參,他是一個類數(shù)組,有l(wèi)ength屬性,但是不能使用數(shù)組的方法, 只能在函數(shù)內(nèi)部使用.
function sum(x) {
console.log(x);
}
function sum(x, y) {
console.log(x+y); //--->>3
}
sum(1);
sum(1, 2);
后面的函數(shù)覆蓋了前面的函數(shù),因為同一個變量,地址覆蓋了
1.依據(jù)函數(shù)實參的個數(shù)來進行模擬函數(shù)的重載
var Add = function () {
var len = arguments.length; //獲取函數(shù)實參的個數(shù)
if (len === 0) {
console.log('no-param');
return this;
} else if(len === 1) {
console.log('one-param');
return this;
} else if(len ===2) {
console.log('two-param');
return this;
} else {
console.log('param > 2');
return this;
}
};
Add();
Add(1);
Add(1, 2);
Add(1, 2, 3);
2.依據(jù)形參的類型進行模擬函數(shù)的重載
var Add = function () {
if (typeof arguments[0] === 'number') {
console.log('number-type-one-param');
}
if (typeof arguments[0] === 'string') {
console.log('string-type-one-param');
}
};
Add(10);
Add('100');
3.倆種方式混合進行使用
var Add = function () {
if (arguments.length === 2 && typeof arguments[0] === 'number') {
console.log('prarm-2, first-parma-type-number');
}
if (arguments.length === 2 && typeof arguments[0] ==='string') {
console.log('prarm-2, first-parma-type-string');
}
};
Add(1 , 20);
Add('10' , 20);
4.案例,針對卡片進行增刪改查功能
var Card = function (type, id) {
var len = arguments.length,
type = typeof arguments[0],
value = arguments[0];
if ((len===2) && (type === 'string') && (value === 'delete')) {
console.log('delete-card');
return false;
}
if ((len === 2) && (type === 'string') && (value === 'update')) {
console.log('update-card');
return false;
}
if ((len === 2) && (type === 'string') && (value === 'addCard')) {
console.log('addCard-card');
return false;
}
if ((len === 2) && (type === 'string') && (value === 'search')) {
console.log('searchcard-card');
return false;
}
};
Card('addCard', '10012');
Card('delete', '10012');
Card('update', '10012');
Card('search', '10012');