手記 《半年工作經驗今日頭條和美團面試題面經分享》

路從今夜白丶發表於2019-01-02

最近看到一篇文章《半年工作經驗今日頭條和美團面試題面經分享》,對於文章裡出現的面試題參考各種資料寫了一下,有寫的不完善的地方希望大家友善討論~

原文連結:半年工作經驗今日頭條和美團面試題面經分享 - 掘金

一、css和html

 A元素垂直居中
 A元素距離螢幕左右各邊各10px
 A元素裡的文字font—size:20px,水平垂直居中
 A元素的高度始終是A元素寬度的50% 
複製程式碼

<html>
<head>
	<title>測試css</title>
</head>
<body>
	<div class="father">
		<div class="child">啊啊啊啊</div>
	</div>
</body>
<style>
	.father {
		height: 100%;
		width: 100%;
		display: flex;
		align-items:center;
		text-align: center;
		background:#222;
		padding: 0 10px;
	}

	.child {
		margin: auto;
		width: 100%;  
		padding-top: 25%;  // width和padding百分比的基數 都是父元素的寬度
		padding-bottom: 25%;
		background:#eee;
		font-size: 20px;
		height: 0;
	}
</style>
</html>
複製程式碼

二、函式arguments

函式中的arguments是陣列嗎?怎麼轉陣列?
複製程式碼
一、 arguments是類陣列, 擁有陣列的index和length屬性, 不能直接呼叫陣列的方法
二、 類陣列轉陣列的幾種方法
1. Array.from(arguments)
2. [...arguments]
3. Array.prototype.slice.call(arguments) 或者 [].prototype.slice.call(arguments)
複製程式碼

三、以下列印結果

if([]==false){console.log(1)};
if({}==false){console.log(2)};
if([]){console.log(3)}
if([1]==[1]){console.log(4)}
複製程式碼
結果: 輸出1 3
==兩邊
Object型別會先轉換為原始型別, 具體是通過valueOf()和toString()方法
1. 左側: [].valueOf還是[],呼叫toString()方法, [].toString為''''為String型別,需要轉換為Number,為0
   右側: false為boolean型別,需要轉換為number,為0
2. 左側: 同上,{}.toString為'[object Object]',需要轉換為Number,為NaN
   右側:false為boolean型別,需要轉換為number,為0
3. []轉換為boolean型別為true
4. 引用地址不同
複製程式碼

四、以下輸出結果

 async function async1(){
    console.log('async1 start')
    await async2()
    console.log('async1 end')
  }
  async function async2(){
    console.log('async2')
  }
  console.log('script start')
 setTimeout(function(){
    console.log('setTimeout') 
 },0)  
 async1();
 new promise(function(resolve){
    console.log('promise1')
    resolve();
 }).then(function(){
    console.log('promise2')
 })
 console.log('script end')

複製程式碼
script start
async1 start
async2
promise1
script end
promise2
async1 end
setTimeout

主要注意 await async2() 相當於 
new Promise(()=>{
	console.log(async2)
}).then((resolve) => {
	resolve()
})

複製程式碼

五、手寫bind

注意建構函式不能使用箭頭函式定義, this指向問題

Function.prototype.binds = function (context) {
    if (typeof this !== "function") {
      throw new Error("Function.prototype.bind - what is trying to be bound is not callable");
    }

    let self = this;
    let beforeArgs = Array.prototype.slice.call(arguments, 1);
    let fNOP = function () {};

    let fbound = function () {
        let lastArgs = Array.prototype.slice.call(arguments);
        self.apply(this instanceof fNOP ? this : context, beforeArgs.concat(lastArgs));
    }

    fNOP.prototype = this.prototype;
    fbound.prototype = new fNOP(); // 使用空函式過渡, 修改新函式prototype時不會對原函式的prototype造成影響

    return fbound;
  }
複製程式碼

六、節流函式

// fn是我們需要包裝的事件回撥, interval是時間間隔的閾值
function throttle(fn, interval) {
  let last = 0
  
  return function () {
      let context = this
      let args = arguments
      let now = +new Date()
      
      if (now - last >= interval) {
          last = now;
          fn.apply(context, args);
      }
    }
}
複製程式碼

七、隨意給定一個無序的、不重複的陣列data,任意抽取n個數,相加和為sum,也可能無解,請寫出該函式


/**
 * 獲取陣列arr內,num個數的全組合
 * 比如 arr = [1,2,3,4], num = 3
 * 返回 [[1,2,3], [1,2,4], [1,3,4], [2,3,4]]
 * @param {*} arr 
 * @param {*} num 
 */
function getCombination(array, number) {
    let result=[];
    (function (group,arr,num){
        if (num == 0) {
            return result.push(group);            
        }
        let length = arr.length
        for (let i = 0; i <= length-num; i++) {
            arguments.callee(group.concat(arr[i]), arr.slice(i + 1), num - 1);
        }
    })([], array, number);
    return result;
}

/**
 * 隨意給定一個無序的、不重複的陣列data,任意抽取n個數,相加和為sum,也可能無解,請寫出該函式
 * @param {*} arr 
 * @param {*} num 
 * @param {*} sum 
 */
function main(arr, num, sum) {
    let result = [];
    let list = getCombination(arr, num);
    for (let item of list) {
        let listSum = item.reduce((pre, current) => {
            return pre + current;
        },0)
        if (listSum == sum) {
            result.push(item);
        }
    }
    return result;
}

const arr = [-1,1,2,3,4,5]
const num = 2;
const sum = 6;
const result = main(arr, num, sum);
console.log(result)


複製程式碼

參考文章:

相關文章