最近看到一篇文章《半年工作經驗今日頭條和美團面試題面經分享》,對於文章裡出現的面試題參考各種資料寫了一下,有寫的不完善的地方希望大家友善討論~
原文連結:半年工作經驗今日頭條和美團面試題面經分享 - 掘金
一、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)
複製程式碼
參考文章: