1、找出數字數組中最大的元素(使用Math.max函數)
1 2 3 | var ?a = [1, 2, 3, 6, 5, 4]; var ?ans = Math.max.apply( null , a); console.log(ans);?? // 6 |
這題很巧妙地用了apply,如果不是數組,是很多數字求最大值,我們知道可以這樣:
1 2 | var ?ans = Math.max(1, 2, 3, 4, 5, 6); console.log(ans);? // 6 |
而apply的第二個參數正是一個數組,都不用進行轉換了。
還有一種用eval+toString的實現:
1 2 3 | var ?a = [1, 2, 3, 6, 5, 4]; var ?ans = eval(? 'Math.max(' ?+ a.toString() +? ')' ); console.log(ans);? // 6 |
2、轉化一個數字數組為function數組(每個function都彈出相應的數字)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | var ?a = [1, 2, 3, 4, 5, 6]; var ?len = a.length; for ( var ?i = 0; i < len; i++) { ?? var ?num = a[i]; ?? ( function (num) { ???? var ?f =? function () { ?????? console.log(num); ???? }; ???? a[i] = f; ?? })(num); } for ( var ?i = 0; i < len; i++) ?? a[i](); // 1 // 2 // 3 // 4 // 5 // 6 |
我覺得這跟給n個a標簽,彈出相應標簽對應的編號是一個類型的題,用閉包保存變量到內存即可。
3、給object數組進行排序(排序條件是每個元素對象的屬性個數)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | var ?a = { ?? name:? 'hanzichi' , ?? age: 10, ?? location:? 'china' }; var ?b = { ?? name:? 'curry' }; var ?c = { ?? name:? 'kobe' , ?? sex:? 'male' }; Object.prototype.getLength =?? function () { ?? var ?num = 0; ?? for ( var ?key? in ?this ) { ???? if ( this .hasOwnProperty(key)) ?????? num++; ?? } ?? return ?num; }; var ?arr = [a, b, c]; arr.sort( function (a, b) { ?? return ?a.getLength() > b.getLength(); }); console.log(arr); |
這題不難,數組排序,當然是sort,排序條件是對象的屬性個數,可以寫個函數計算,注意可能要用hasOwnProperty判斷下。
4、利用JavaScript打印出Fibonacci數(不使用全局變量)
1 2 3 4 5 6 | ( function (a, b) { ?? var ?c = a + b; ?? console.log(c); ?? if (c > 100)? return ; ?? arguments.callee(b, c); })(-1, 1); |
這題沒看明白,是打出斐波那契數列的前n項么?還是第n項...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | function ?fn(n) { ?? var ?a = []; ?? a[0] = 0, a[1] = 1; ?? for ( var ?i = 2; i < n; i++) ???? a[i] = a[i - 1] + a[i - 2]; ?? for ( var ?i = 0; i < n; i++) ???? console.log(a[i]); } fn(5);? // 10表示需要的斐波那契數列個數 // 0 // 1 // 1 // 2 // 3 |
不使用全局變量,我把它們寫在函數里了應該算是局部變量了吧,難道這樣就好了?你怎么看?
5、實現如下語法的功能:var a = (5).plus(3).minus(6); //2
1 2 3 4 5 6 7 8 9 10 | Number.prototype.plus =? function (a) { ?? return ?this ?+ a; }; Number.prototype.minus =? function (a) { ?? return ?this ?- a; }; var ?a = (5).plus(3).minus(6); console.log(a);? // 2 |
直接在Number對象上加擴展方法即可,傳說中這樣很不好,but我也想不到更好的辦法了...
6、實現如下語法的功能:var a = add(2)(3)(4); //9
1 2 3 4 5 6 7 8 9 10 11 | function ?add(a) { ?? var ?temp =? function (b) { ???? return ?add(a + b); ?? } ?? temp.valueOf = temp.toString =? function () { ???? return ?a; ?? }; ?? return ?temp; } var ?ans = add(2)(3)(4); console.log(ans);? // 9 |
對valueOf和toString的考察,具體可以參考《valueOf和toString》?
另看到一種很飄逸的寫法(來自Gaubee):
1 2 3 4 5 6 7 8 | function ?add(num){ ?? num += ~~add; ?? add.num = num; ?? return ?add; } add.valueOf = add.toString =? function (){ return ?add.num}; var ?ans = add(3)(4)(5)(6);?? // 18 alert(ans);
|