javascript
汤姆大叔 深入理解JavaScript系列(20):《你真懂JavaScript吗?》答案详解 后六道题答案...
原題目地址:http://www.cnblogs.com/TomXu/archive/2012/02/10/2342098.html
答案豐富多彩。我只是記錄下自己思考了半天全部的答案。
?
題目一:找出數(shù)字數(shù)組中最大的元素(使用Match.max函數(shù))
這個題目,看到Match,不知道啥東西,結果放在最后,
用了個很笨的解決方法:
var arr=[0,1,2,3,4,5,6,7,8,9],arrFunc = [], max = -Infinity for(var i = 0, l = arr.length; i < l; i++){max = Math.max(max,arr[i]) } console.log(max);后來看了下原文評論,原來這么簡單。
var arr=[0,1,2,3,4,5,6,7,8,9]; console.log(Math.max.apply(null,arr))這個問題就沒啥好解析的了。
題目二:轉化一個數(shù)字數(shù)組為function數(shù)組(每個function都彈出相應的數(shù)字)
for循環(huán)閉包的問題,大叔的文章很多提到這個問題。
var arr=[0,1,2,3,4,5,6,7,8,9],arrFunc = []; for(var i = 0, l = arr.length; i < l; i++){arrFunc.push((function(i) {return function() {console.log(arr[i]);}})(i)) }個人覺得對于閉包最簡單的解析:閉包的作用就是保存當前的作用鏈域的環(huán)境。
?
題目三:給object數(shù)組進行排序(排序條件是每個元素對象的屬性個數(shù))
這個說起來好像很坑爹的趕腳。我居然用了這么笨的想法。
Object.prototype.myLength = function(){var length = 0;for(var i in this){length ++;}return length; } var objArr = [{a:1, b:2, c:5, d:7, e:8, g:0, h:12, i:5, v:9, w:9, x:9, y:9, z: 15},{a:2, b:2, c:5, d:7, e:8, g:0, h:12, i:5, j:7, k:5, l:9, m:9, n:0, o:1, p:9, x:9, y:9, z:9 }, {a:3, b:2, c:5, d:7, e:8, g:0, h:12, i:5, j:7, k:5, l:9, m:9, n:0, o:1, p:9, q:0 },{a:4, b:2, c:5, d:7, e:8, g:0, h:12, i:5, j:7, k:5, w:9, x:9, y:9, z:9 },{a:5, b:2, c:5, d:7, e:8, g:0, h:12, i:5, j:7, k:5, v:9, w:9, x:9, y:9, z:9 },{a:6, b:2, c:5, d:7, e:8, g:0, h:12, i:5, j:7, k:5, l:9, m:9, n:0, o:1, p:9, q:0, r:8, s:9, t:9, z:9 },{a:7, b:2, c:5, d:7, e:8, x:9, y:9, z:9 } ]; // arr before sort var numArr1 = [] for(var i = 0, l = objArr.length; i < l; i++ ){numArr1.push( objArr[i].myLength() ) } console.log(numArr1.join(" ")) //result // arr after sort objArr.sort(function(a,b){// stable sort// return (a.myLength() > b.myLength()) === true? 1:-1;// unstable sortreturn (a.myLength() >= b.myLength()) === true? 1:-1;// return a.myLength() - b.myLength(); }) var numArr2 = [] for(var i = 0, l = objArr.length; i < l; i++ ){// console.log(i,l,objArr[i].myLength()); numArr2.push( objArr[i].myLength() ) } console.log(numArr2.join(" ")) //result感覺突然自己的想法和別人的有點不同(不好的方向)。
?
題目四:利用JavaScript打印出Fibonacci數(shù)(不使用全局變量)
這個問題,寫完之后我看了下其他人的寫法,一半一半都沒寫中間緩存保存,我覺得這也是大叔表明不適用全局變量的原因,我把兩種方式都寫了進去。
這個是有緩存的,
var fibonacci = (function(){var s = [];var fun = function(x) {if(s[x]){return s[x];}if(x < 0) {throw "Can't be negative";return ;}else if(x === 0 || x === 1) {s[x] = s[x] || x;return s[x];}else{s[x] = ( fun(x - 1) + fun(x - 2) );return s[x];}};fun.print = function() {console.log(s.join(" "));}fun.printLast = function() {// console.log(s.length);return(s[s.length-1]);}window.s = s;return fun;})() console.time(200); console.log(fibonacci(200)); console.log(fibonacci.printLast()); console.log(fibonacci.print()); console.timeEnd(200);測試幾百幾千位的時間不足1000ms。
這個是遞歸無緩存的,
var fibonacci2 = function(x){if(x < 0) {throw "Can't be negative";return ;}if(x === 0 || x === 1) {return x;}var num = ( fibonacci2(x - 1) + fibonacci2(x - 2) )return num; } console.time(32); console.log(fibonacci2(32)); console.timeEnd(32);測試個32位已經(jīng)4000ms+,時間呈數(shù)量級增長,太坑。
題目五:實現(xiàn)如下語法的功能:var a = (5).plus(3).minus(6); //2
這個算是最簡單的吧,但是我居然和別人的不一樣,都能運行。
Number.prototype.plus = function(x) {var num = this.valueOf() + x;return Number(num); } Number.prototype.minus = function(x) {var num = this.valueOf() - x;return Number(num); }var a = (5).plus(3).minus(6); console.log(a); alert(a);人家直接返回一個num,我返回一個Number封裝的num對象,其實都一樣是Number對象。
題目六:實現(xiàn)如下語法的功能:var a = add(2)(3)(4); //9
這個題目算是第一個做出來的題目,因為我覺得這個題目的要求最簡單,一看就記得,半夜睡醒了在床上直接腦袋打草稿運行了。
function add(x) {var mid;mid = x || 0;function addObj(x) {x = x || 0;mid = mid + x;return addObj;}addObj.valueOf = function() {return mid;}addObj.toString = function() {return mid;}return addObj; } //call the obj.valueOf function console.log(add(2)); console.log(add(2)(3)); console.log(add(2)(3)(4)); console.log(add(2)(3)(4)(5));//call the obj.toString function alert(add(2)); alert(add(2)(3)); alert(add(2)(3)(4)); alert(add(2)(3)(4)(5));?能無限調用。
?
寫完上述代碼,我參考了下原文評論里面的,看了下自己的代碼,和別人的比較下,有好的地方,也有不足之處,不過我的代碼比較淺顯,不想部分人寫的那些看了很久才看明白,特別是那個寫了緩存的fibonacci數(shù)列的答案。
轉載于:https://www.cnblogs.com/shenqi0920/p/3537690.html
總結
以上是生活随笔為你收集整理的汤姆大叔 深入理解JavaScript系列(20):《你真懂JavaScript吗?》答案详解 后六道题答案...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: junit单体测试(PowerMocki
- 下一篇: PHPCMS 核心代码与 www 分离部