新年第一記,從這里開始,先來個簡單的!去年的知識梳理留下了很多尾巴,原因有很多(知識儲量不足,懶了,項目多...) lg:都是借口~ 好吧,我承認,這都是借口,今年一定把尾巴清干凈!
下面要寫的是知識梳理的第一個案例:
- 寫一個求和的方法sumFn,不管傳遞的參數有什么,都能將最終的和算出來,並且返回給函數外部使用。(要求:一個參數都不傳默認結果為0,對於傳遞的非正常數字的參數不與累加操作);
這個案例主要要考察的知識點是 arguments 參數,來給個特寫,什么意思呢?
arguments 參數是一個比較特殊的對象,是當前函數的一個內置屬性,它非常想Array,但卻不是Array lg:說的什么,還是不懂~ 額,好吧,例子勝過一切雄辯,咱們舉幾個栗子來看看:
function abc(a,b,c){ //看看arguments是什么 console.log(arguments); } abc(1,2,3) ; //[1,2,3] 這不是數組嗎 function abc(a,b,c){ //看看arguments是什么類型的 console.log(typeof arguments) } abc(1,2,3) ; //object 這是對象,不是數組
看看,是不是有點意思,似數組非數組 lg:那它怎么用呢~ 這個問題問的好,看下面代碼:
function abc(a,b,c){ var len = arguments.length; console.log(len); console.log(arguments[0]); console.log(arguments[1]); } abc(1,2,3); // 3 , 1 , 2 //長度為3,第一個值為1,第二個值為2... 看來是具有對應關系的
lg:就只有這2下子?一點都不好玩~ 呵,你還急了,當然不只這兩下子啊,它有一個非常實用的功能,就是在函數中,無需明確指出參數名,arguments能直接訪問它,你說屌不屌,耳聽為虛,眼睛為使:
function abc(){ var a = arguments; var num = arguments[0] + arguments[1] + arguments[2]; //這里可以用循環,為方便查看,拆開了寫,你懂的 console.log(num); } abc(1,2,3); // 6 說明可以獲取 //正常來說,函數沒有參數,應該是要報錯的,如果能成功運行,說明它具備這個神級
lg:果然了得啊,那它還有沒有其他的吊炸天技能呢? 當然有啦!arguments對象中有一個非常有用的屬性:callee。arguments.callee返回此arguments對象所在的當前函數引用。在使用函數遞歸調用時推薦使用arguments.callee代替函數名本身。舉個栗子:
function abc(a){ if(a==1){ return 1; } return a + arguments.callee(--a); } var mm = abc(10); console.log(mm); // 55
//arguments.callee(--a) 執行了遞歸調用,這樣就完成了1~9的累加
看到這里,上面說的例子應該就不難寫了吧,來跟着我左手右手一個慢動作:
function sumFn(){ var arg = arguments; var sum = 0; if(arg == '' || arg == ' ' || arg ==null){ sum = 0; }else{ for(var i=0;i<arg.length;i++){ if(isNaN(arg[i]) || arg[i] == '' || arg[i] ==' '){ sum = sum; }else{ sum +=arg[i]; } } } return sum; } var num1 = sumFn(2) + sumFn(3); console.log(num1); //5 var num2 = sumFn(2,3,4); console.log(num2); //9 var num3 = sumFn(); console.log(num3); //0 var num4 = sumFn(1,'e',6); console.log(num4); //7
到這里,不知道你對這個例子理解了沒有, lg: 這么好的東西,兼容性怎么樣呢? 哈哈,這么吊炸天的東西,兼容性還特別的好,你說氣不氣人,經測試,支持所有瀏覽器!
好了,它是對象,它也有對象,但是我還沒有對象,嗚嗚嗚~~~,我要去找對象去了!
行文倉促!有理解的不正確的或者是遺漏的東西,萬望批評指正!不勝感激!

