湯姆大叔 深刻理解JavaScript系列(20):《你真懂JavaScript嗎?》答案詳解 後六道題答案

原題目地址:http://www.cnblogs.com/TomXu/archive/2012/02/10/2342098.htmlhtml

答案豐富多彩。我只是記錄下本身思考了半天所有的答案。數組

 

題目一:找出數字數組中最大的元素(使用Match.max函數)緩存

這個題目,看到Match,不知道啥東西,結果放在最後,閉包

用了個很笨的解決方法:app

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))

這個問題就沒啥好解析的了。測試


題目二:轉化一個數字數組爲function數組(每一個function都彈出相應的數字)this

for循環閉包的問題,大叔的文章不少提到這個問題。spa

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))
}

我的以爲對於閉包最簡單的解析:閉包的做用就是保存當前的做用鏈域的環境。prototype

 

題目三:給object數組進行排序(排序條件是每一個元素對象的屬性個數)

這個提及來好像很坑爹的趕腳。我竟然用了這麼笨的想法。

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 sort
  return (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數(不使用全局變量)

這個問題,寫完以後我看了下其餘人的寫法,一半一半都沒寫中間緩存保存,我以爲這也是大叔代表不適用全局變量的緣由,我把兩種方式都寫了進去。

這個是有緩存的,

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位已經4000ms+,時間呈數量級增加,太坑。


題目五:實現以下語法的功能: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對象。


題目六:實現以下語法的功能: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數列的答案。

相關文章
相關標籤/搜索