一些面試題的總結

最近呢,出去面試了兩家公司,可惜都沒有什麼結果,就此記錄一下我印象比較深刻的一些問題吧:

在ES5下實現const的功能(還問了const定義的對象和數組能否修改,爲什麼)

var const_=function (varName,value){
    window.varName=value;
    Object.defineProperty(window,varName,{
        enumerable:false,
        configurable:false,
        get:function(){
            return value;
        },
        set:function(data){
            if(data!==value){
                throw new TypeError('不允許修改');
            }else{
                return value;
            }
        }   
    })
}
const_('a',20);
a=30;//報錯

vue是怎麼實現數據的雙向綁定(其實這個和上面的問題是一個知識點)

這個和上面的方法是一樣的,通過監聽對象上的get和set,從而實現在修改數據的時候及時判斷是否需要更新。這也是爲啥每次console vue中的數據是打印出來的都是getter和setter具體的代碼就不寫了,差不多的

純函數相關,涉及到react

純函數的標準定義百度即可,我的理解就是:吃啥吐啥,雷打不動,React中的純組件(或者說是函數式組件)就是一個純函數,給我啥數據我顯示啥視圖,賊穩。再比如Redux中的reducer也是純函數,負責處理action提供的數據。React文檔中就說過,react特別執着於純函數。

關於數據轉換的問題(這類型問題兩個公司都問了,感覺是比較關鍵的點)

這個是真的沒想到,一年前我面試的時候還沒這類型的問題,感覺自己答的不是很好。。。心態炸裂啊

就舉第二家公司的例子吧:

後臺給你返回的數據是:[{year:2000,month:1,day:11,birth:200}]這種格式的,計算出每年每個月出生的人數以及在當年的佔比,並且能夠在視圖中展現

假設初始數據是:
arr: [
        {year:2000,month:1,day:11,birth:200},
        {year:2000,month:1,day:11,birth:20},
        {year:2010,month:2,day:22,birth:100},
        {year:2000,month:1,day:11,birth:200},
        {year:2012,month:3,day:11,birth:200},
        {year:2004,month:4,day:11,birth:200},
        {year:2013,month:10,day:11,birth:200},
        {year:2017,month:7,day:11,birth:200},
        {year:2019,month:7,day:11,birth:200},
        {year:2018,month:8,day:11,birth:200},
        {year:2005,month:12,day:11,birth:200},
        {year:2005,month:11,day:11,birth:200},
        {year:2004,month:1,day:11,birth:200},
        {year:2000,month:10,day:11,birth:200},
        {year:2016,month:11,day:11,birth:200},
      ];
// 不使用lodash
let years=arr.map(item=>item.year);
let yearsUnique=[...new Set(years)];
let yearMonths=yearsUnique.map(item=>{
    var monthArr=[];
    var yeartotal=0;
    arr.map(citem=>{
      if(citem.year==item){
        yeartotal+=citem.birth;
        if(monthArr.length<=0){
          monthArr.push({month:citem.month,birth:citem.birth});
        }else{
          monthArr.forEach((mitem,index)=>{
            if(mitem.month==citem.month){
              monthArr[index].birth=citem.birth+mitem.birth;
            }else{
              monthArr.push({month:citem.month,birth:citem.birth});
            }
          })
        }
          
      }
    })
    monthArr.forEach(item=>{
      item.precent=(Math.round((item.birth/yeartotal)*100))+'%'
    })
    return {year:item,month:monthArr,yearBirth:yeartotal};
})
// 最終結果
[
    { 
        "year": 2000, 
        "month": [ 
                    { "month": 1, "birth": 420, "precent": "68%" }, 
                    { "month": 10, "birth": 200, "precent": "32%" } 
                 ], 
        "yearBirth": 620 
    },
    { 
        "year": 2010, 
        "month": [ 
                    { "month": 2, "birth": 100, "precent": "100%" }
                 ], 
        "yearBirth": 100 
    },
    .
    .
    .
]
// 使用lodash
const yearsMonths=arr.map(item=>{
      return {year:item.year,month:item.month}
    });
const yearsMonthsUnique=_.uniqWith(yearsMonths,_.isEqual);

let res=yearsMonthsUnique.map(item=>{
    var yeartotal=0;
    var monthTotal=0;
    arr.map(citem=>{
      if(item.year==citem.year){
        yeartotal+=citem.birth;
        if(item.month==citem.month){
          monthTotal+=citem.birth;
        }
      }
    })
    return {year:item.year,month:item.month,yearBirth:yeartotal,monthBirth:monthTotal};
})
res.sort(function(prev,next){
    if(prev.year===next.year){
      return prev.month-next.month;
    }else{
      return prev.year-next.year;
    }
})
// 最終結果(percent 再map一遍即可)
[
    { "year": 2000, "month": 1, "yearBirth": 620, "monthBirth": 420 }
    { "year": 2000, "month": 10, "yearBirth": 620, "monthBirth": 200 }
    { "year": 2004, "month": 1, "yearBirth": 400, "monthBirth": 200 }
    { "year": 2004, "month": 4, "yearBirth": 400, "monthBirth": 200 }
    { "year": 2005, "month": 11, "yearBirth": 400, "monthBirth": 200 }
    { "year": 2005, "month": 12, "yearBirth": 400, "monthBirth": 200 }
    { "year": 2010, "month": 2, "yearBirth": 100, "monthBirth": 100 }
    { "year": 2012, "month": 3, "yearBirth": 200, "monthBirth": 200 }
    { "year": 2013, "month": 10, "yearBirth": 200, "monthBirth": 200 }
    { "year": 2016, "month": 11, "yearBirth": 200, "monthBirth": 200 }
    { "year": 2017, "month": 7, "yearBirth": 200, "monthBirth": 200 }
    { "year": 2018, "month": 8, "yearBirth": 200, "monthBirth": 200 }
    { "year": 2019, "month": 7, "yearBirth": 200, "monthBirth": 200 }
]

說實話,這些數據轉換的題有時候是真的燒腦,感覺賊繞

關於閉包

也是一道題:f()=''; f('a')()='a'; f('a')('b')()='ab'; f('a')('b')('c')()='abc'·····實現一個類似這種的函數

 


結語:這次的面試更多的是瞭解一下當前市場的需求,以及涉及的一些新的技術,當然能找到更好的工作自然是極好的(偷笑),以後再遇到一些比較印象深刻的問題也會及時的記錄

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章