關於腳本語言的誤會
起初對於腳本語言,也就是剛開始學習 JS 的時候了,是帶有一定的誤會的,現在看來還挺好玩的,那時候覺得腳本語言就是弱語言也就是“很弱”的語言了,無法設計出很複雜的程序。
對不起,誤會你了。
所以決定寫一個重識(重拾)JS 系列的文章,以此謝罪。
方法的重載(Function overloading)
先看百度百科中對於方法重載的定義
方法重載是指在一個類中定義多個同名的方法,但要求每個方法具有不同的參數的類型或參數的個數。調用重載方法時,編譯器能通過檢查調用的方法的參數類型和個數選擇一個恰當的方法。
我們總結一下就是根據不同的參數情況來選擇執行不同的程序。
依賴兩件事情:方法中 參數數量 和 參數類型
1.參數數量:
方法參數僞數組(pseudo-array) -> arguments 這個數組具有.length 屬性來獲取參數列表的長度 arguments.length
實驗一 —— 使用這個方法的參數僞數組寫一個任意個參數求和
// 接受多個參數求和的方法
var addAll = function() {
var sum = 0;
for(var i = 0; i < arguments.length; i++) {
sum += arguments[i];
}
return sum;
}
var result1 = addAll(1,2,3,6);
var result2 = addAll(6,4,5,9,1,9,8,58);
console.log("result1: " + result1);
console.log("result2: " + result2);
// 輸出
// result1: 12
// result2: 100
2. 參數類型:
typeof typeof obj == “object” 構造函數屬性:constructor 屬性 str.constructor == Array
實驗二 —— 檢查參數類型
我們回頭看一下實驗一中存在一個問題就是如果在調用函數 addAll 時傳入一個字符串會得到一個錯誤的結果。聰明的你肯定已經想到辦法了,在遍歷方法參數數組時判斷 typeof arguments[i] == “number” 或者 arguments[i].constructor == Number
每次都這樣去檢查參數類型很累,當然我們可以寫一個通用一點的檢查參數的方法,來確保我們函數的輸入。
// 嚴格檢查參數列表
// args: types Array 檢查參數的類型數組
// args Array 方法中的 arguments
var checkArguments = function(types, args) {
// 檢查參數數量
if( types.length != args.length) {
throw "參數數量異常:類型數量:" + types.length + ",參數數量:" + args.length;
}
for(var i = 0; i < arguments.length; i++) {
if(args[i].constructor != types[i]) {
throw "參數類型異常:參數" + args[i] + "的類型爲 " + args[i].constructor.name + " 檢查的類型爲:" + types[i].name ;
}
}
}
// 接受兩個參數求和的方法
var addTwo = function() {
checkArguments([Number,Number],arguments);
var sum = 0;
for(var i = 0; i < arguments.length; i++) {
sum += arguments[i];
}
return sum;
}
var result3 = addTwo(2, 6);
console.log("result3: " + result3); // 輸出 result3: 8
// addTwo(1, "1"); // 輸出 Uncaught 參數類型異常:參數1的類型爲 String 檢查的類型爲:Number
addTwo(3, 4, 5); // 輸出 Uncaught 參數數量異常:類型數量:2,參數數量:3
知道了上面的 JS 對於方法參數長度和參數類型的判斷方法之後,我們就可以來重載方法了。
實驗三 —— 方法的重載爲你推薦歌曲
// 根據不同的參數推薦不同的歌曲
var playSomething = function() {
if(arguments.length == 1) {
if(arguments[0].constructor == Object) {
console.log("Hey!sing Dog!"); // object not found
}else {
console.log("單身情歌");
}
}else if(arguments.length == 2) {
if(arguments[0].constructor != arguments[1].constructor) {
console.log("有情人終成兄妹");
}else{
console.log("好心分手");
}
}else if(arguments.length == 3) {
console.log("聖誕節-紅花會");
}else {
console.log("學會了"); // xixi, 學會了嗎
}
}
playSomething({name:"Dog"});
playSomething("達爾文","埃瑪");
playSomething("pig",{name:"pig"});
playSomething("PG ONE","李小璐","賈乃亮");
playSomething("java","python","node","lua","php","swift","javascript");
// Hey!sing Dog!
// 好心分手
// 有情人終成兄妹
// 聖誕節-紅花會
// 學會了
// Here with You <- 悄悄加的,不知道會不會被人發現