最近呢,出去面試了兩家公司,可惜都沒有什麼結果,就此記錄一下我印象比較深刻的一些問題吧:
在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'·····實現一個類似這種的函數
結語:這次的面試更多的是瞭解一下當前市場的需求,以及涉及的一些新的技術,當然能找到更好的工作自然是極好的(偷笑),以後再遇到一些比較印象深刻的問題也會及時的記錄