刷前端面經筆記(十二)

1.以下遞歸函數(shù)存在棧溢出的風險,請問如何優(yōu)化?

function factorial(n){
    return n*factorial(n-1)
}

解答:

function factorial(n){
    return n > 1 ? n * factorial(n-1) : 1;
}

2.請實現(xiàn)一個計算最大公約數(shù)的函數(shù):

function greatestCommonDivisor(a,b){
//在這里編寫代碼
}
greatestCommonDivisor(8, 12) //4
greatestCommonDivisor(8, 16) //8
greatestCommonDivisor(8, 17) //1

解答:

function greatestCommonDivisor(a,b){
  var num=0;  
      while(b!=0){       
           num=a%b;  
           a=b;  
           b=num;  
      }  
      return a;

}

3.數(shù)組去重(如果數(shù)組中有NaN)

Array.prototype.uniq = function () {
   var resArr = [];
   var flag = true;
      
   for(var i=0;i<this.length;i++){
       if(resArr.indexOf(this[i]) == -1){
           if(this[i] != this[i]){   

               //排除 NaN
              if(flag){
                   resArr.push(this[i]);
                   flag = false;
              }
           }else{
                resArr.push(this[i]);
           }
       }
   }
    return resArr;
}

4.用 JavaScript 實現(xiàn)斐波那契數(shù)列函數(shù),返回第n個斐波那契數(shù)市框。 f(1) = 1, f(2) = 1 等

function fibonacci(n) {
    if(n ==1 || n == 2){
        return 1
    }
    return fibonacci(n - 1) + fibonacci(n - 2);
}

5.根據(jù)包名缘挽,在指定空間中創(chuàng)建對象

輸入描述:

namespace({a: {test: 1, b: 2}}, 'a.b.c.d')

輸出描述:

{a: {test: 1, b: {c: {d: {}}}}}

function namespace(oNamespace, sPackage) {
 
    var properties = sPackage.split('.');
    var parent = oNamespace;
 
    for (var i = 0, lng = properties.length; i < lng; ++i) {
 
        var property = properties[i];
 
        if (Object.prototype.toString.call(parent[property])!== '[object Object]') {
            parent[property] = {};
        }
 
        parent = parent[property];
 
    }
 
    return oNamespace;
 
}

6.封裝函數(shù) f,使 f 的 this 指向指定的對象

function bindThis(f, oTarget) {
    return function(){
        var parames = Array.prototype.slice.call(arguments);
        return f.apply(oTarget,parames); //注意這里需要返回f的執(zhí)行結果
    }  
}

7.dom 節(jié)點查找

查找兩個節(jié)點的最近的一個共同父節(jié)點屡穗,可以包括節(jié)點自身

輸入描述:

oNode1 和 oNode2 在同一文檔中,且不會為相同的節(jié)點

function commonParentNode(oNode1, oNode2) {
    if(oNode1.contains(oNode2)){
        return oNode1;
    }else if(oNode2.contains(oNode1)){
        return oNode2;
    }else{
        return commonParentNode(oNode1.parentNode,oNode2);
    }
}

8.關系型數(shù)組轉換成樹形結構對象

關系型數(shù)組:

var obj = [
    { id:3, parent:2 },
    { id:1, parent:null },
    { id:2, parent:1 },
]

期望結果:

o = {
  obj: {
    id: 1,
    parent: null,
    child: {
      id: 2,
      parent: 1,
      child: {
          id: ,3,
          parent: 2
      }
    }
  }
}

實現(xiàn)源碼:

function treeObj(obj) {
  obj.map(item => {
    if (item.parent !== null) {
      obj.map(o => {
        if (item.parent === o.id) {
          if (!o.child) {
            o.child = [];
          }
          o.child.push(item);
          o.child = o.child;
        }
      });
    }
  });
  return obj.filter(item => item.parent === null)[0]
}

或者:

function treeObj(obj) {
  return obj.sort((a, b) => b.parent - a.parent)
      .reduce((acc, cur) => (acc ? { ...cur, child: acc } : cur));
}

9.JS如何判斷一組數(shù)字是否連續(xù)

// 當出現(xiàn)連續(xù)數(shù)字的時候以‘-’輸出
[1, 2, 3, 4, 6, 8, 9, 10]

期望結果:

["1-4", 6, "8-10"]

實現(xiàn)代碼:

判斷是否連續(xù):

var arrange = function(arr){
    var result = [],temp = [];
    arr.sort(function(source, dest){
        return source - dest;
    }).concat(Infinity).reduce(function(source, dest){
        temp.push(source);
        if(dest-source > 1){
            result.push(temp);
            temp = [];
        }
        return dest;
    });
    return result;
};

格式化實現(xiàn):

var formatarr = function(arr) {
    var newArr = []
    var arr1 = arrange(arr)
    for (var i in arr1) {
        var str = '';
        if (arr1[i].length > 1) {
            str = arr1[i][0] + '-' + arr1[i][arr1[i].length - 1];
            newArr.push(str)
        } else {
            newArr.push(arr1[i][0]);
        }
   }
   return newArr;
}

10.創(chuàng)建子類Child,使用原型和構造函數(shù)的方式繼承父類People的方法咆瘟,并調用say函數(shù)說出姓名和年齡。

父類:

function People(name,age){
     this.name=name;
     this.age=age;
     this.say=function(){
         console.log("我的名字是:"+this.name+"我今年"+this.age+"歲诽里!");
     };
}

原型繼承:

function Child(name, age){
    this.name = name;
    this.age = age;
}
Child.prototype = new People();
var child = new Child('Rainy', 20);
child.say()

構造函數(shù)繼承:

function Child(name, age){
    People.call(this)
    this.name = name;
    this.age = age;
}
var child = new Child('Rainy', 20);
child.say()

組合繼承:

function Child(name, age){
    People.call(this);
    this.name = name;
    this.age = age;
}
Child.prototype = People.prototype;
var child = new Child('Rainy', 20);
child.say()

組合繼承優(yōu)化:

function Child(name, age){
    People.call(this);
    this.name = name;
    this.age = age;
}
Child.prototype = Object.create(People.prototype);
Child.prototype.constructor = Child;
var child = new Child('Rainy', 20);
child.say()
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末袒餐,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子谤狡,更是在濱河造成了極大的恐慌灸眼,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件墓懂,死亡現(xiàn)場離奇詭異焰宣,居然都是意外死亡,警方通過查閱死者的電腦和手機捕仔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進店門匕积,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人榜跌,你說我怎么就攤上這事闪唆。” “怎么了钓葫?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵悄蕾,是天一觀的道長。 經常有香客問我础浮,道長笼吟,這世上最難降的妖魔是什么库物? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮贷帮,結果婚禮上戚揭,老公的妹妹穿的比我還像新娘。我一直安慰自己撵枢,他們只是感情好民晒,可當我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著锄禽,像睡著了一般潜必。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上沃但,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天磁滚,我揣著相機與錄音,去河邊找鬼宵晚。 笑死垂攘,一個胖子當著我的面吹牛,可吹牛的內容都是我干的淤刃。 我是一名探鬼主播晒他,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼逸贾!你這毒婦竟也來了陨仅?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤铝侵,失蹤者是張志新(化名)和其女友劉穎灼伤,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體咪鲜,經...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡饺蔑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了嗜诀。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡孔祸,死狀恐怖隆敢,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情崔慧,我是刑警寧澤拂蝎,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站惶室,受9級特大地震影響温自,放射性物質發(fā)生泄漏玄货。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一悼泌、第九天 我趴在偏房一處隱蔽的房頂上張望松捉。 院中可真熱鬧,春花似錦馆里、人聲如沸隘世。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽丙者。三九已至,卻和暖如春营密,著一層夾襖步出監(jiān)牢的瞬間械媒,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工评汰, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留纷捞,地道東北人。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓键俱,卻偏偏與公主長得像兰绣,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子编振,可洞房花燭夜當晚...
    茶點故事閱讀 45,675評論 2 359

推薦閱讀更多精彩內容

  • 第3章 基本概念 3.1 語法 3.2 關鍵字和保留字 3.3 變量 3.4 數(shù)據(jù)類型 5種簡單數(shù)據(jù)類型:Unde...
    RickCole閱讀 5,130評論 0 21
  • 今天幾個老同事喝酒缀辩,大家團團落座后,把酒言歡踪央,不在話下臀玄,未幾,進來一美女畅蹂,一看認識健无,在老單位時,天天喊我偉哥哥液斜,很...
    鶴舞春風閱讀 275評論 0 1
  • 從頭梳理中國古代史 近代史 累贤,又換了另一個角度, 重新解讀 和我胃口少漆, 差點一下子就聽完了臼膏。 從夏商西周部落開始 ...
    知識日記閱讀 310評論 0 0
  • 《自卑與超越》(what life should mean to you)是個體心理學先驅阿弗雷德·阿德勒的代表作...
    曼曼呀閱讀 154評論 0 0
  • 第二章 1. 重慶的夏天也真是善變,下午還陽光明媚示损,下班的時候就淅淅瀝瀝下起小雨來渗磅。 兩個人都沒有帶傘,就一路淋著...
    貓大人233閱讀 173評論 0 0