字節跳動前端一面面經(帶答案)

一、前言
 面試之前孩還在忙着些業務,感覺複習的有點不紮實,從js到ES6到網絡、vue、webpack,但是面試過程中更加在意的就是基礎的知識的理解與掌握。
二、具體題目

1、說說你一般的代碼規範(我的實習簡歷上寫了,寫代碼時注重代碼規範,就比較挖坑,說了說eslint的一些規則以及命名規範)
2、移動端適配的1px問題有遇到過嗎,大概講講怎麼解決的

(1)我們要先了解像素、分辨率的概念,我們知道我們看到的屏幕的分辨率是640x480,這些數字就是由像素構成的,像素是組成一幅圖像的全部亮度和色度的最小圖像單元(每個像素的大小是不固定的,他是根據設備的分辨率決定的),在屏幕上顯示的像素多,單個像素尺寸比較小。
(2)設備像素與邏輯分辨率(設備獨立像素)
我們手機分辨率翻倍,屏幕更加的清晰,我們的圖像不就要被縮小一倍,我們難道要在每個設備上就出個設計稿,每個設備的分辨不盡相同,所以就用到了邏輯分辨率,喬布斯在iPhone4的發佈會上首次提出了Retina
Display(視網膜屏幕)的概念,在iPhone4使用的視網膜屏幕中,把2x2個像素當1個像素使用,這樣讓屏幕看起來更精緻,但是元素的大小卻不會改變。從此以後高分辨率的設備,多了一個邏輯像素。
(3)設備像素比(設備像素比device pixel ratio簡稱dpr,即物理像素和設備獨立像素的比值)
(4)1px問題出現的原因:當我們css裏寫的1px的時候,由於它是邏輯像素,導致我們的邏輯像素根據這個設備像素比(dpr)去映射到設備上就爲2px,或者3px,由於每個設備的屏幕尺寸不一樣,就導致每個物理像素渲染出來的大小也不同
(5)解決方案 planA:
在web中,瀏覽器爲我們提供了window.devicePixelRatio來幫助我們獲取dpr。在css中,可以使用媒體查詢min-device-pixel-ratio,區分dpr:
我們根據這個像素比,來算出他對應應該有的大小,(弊端,各個瀏覽器的兼容性不一致導致表現出來還是有點問題) planB:transform: scale(0.5) 方案
scale(0.5) 方案,根據是幾倍屏幕來寫縮放的倍數
/* 2倍屏 /
@media only screen and (-webkit-min-device-pixel-ratio: 2.0) {
.border-bottom::after {
-webkit-transform: scaleY(0.5);
transform: scaleY(0.5);
}
}
/
3倍屏 */
@media only screen and (-webkit-min-device-pixel-ratio: 3.0) {
.border-bottom::after {
-webkit-transform: scaleY(0.33);
transform: scaleY(0.33);
}
}

3、寫一寫css吧,固定寬高比例是1:2的div 的實現

兩種方法:操作js(監聽resize()方法來獲取寬度來設置高度)
用純css的padding-bottom:50%或者
padding-top:50%

4、講一講事件模型

<div class = '1'>
	<div class = '2'></div>
</div>
console.log("1")
console.log("2")

如何先打出來1再輸出2
我說了事件捕獲與事件冒泡,點擊一個div 的過程,先是捕獲再是冒泡.
給兩個函數加一個監聽事件,注意addEventListener的第三個參數,當爲true的時候爲事件捕獲的方式,代碼如下:

var x = document.getElementByClassName('1')[0]
x.addEventListener('click',function(){
	console.log("1")
},true)
var y = document.getElementByClassName('2')[0]
y.addEventListener('click',function(){
	console.log("2")
},true)

5、講一講axios的方式吧
我說了get、post、put、delete
6、說說get、post區別

(1)GET使用URL或Cookie傳參,而POST將數據放在BODY中”,這個是因爲HTTP協議用法的約定。
(2)GET方式提交的數據有長度限制,則POST的數據則可以非常大”,這個是因爲它們使用的操作系統和瀏覽器設置的不同引起的區別
(3)POST比GET安全,因爲數據在地址欄上不可見”, (4)get請求後,按後退按鈕/刷新按鈕無影響,post數據會被重新提交
(5)get和post是具有相同的語法的,但是有不同的語義,get是用來獲取數據的,post是用來發送數據的,()
(6)最重要的一點就是,get、post本質上沒有一點點差別、知識協議或者規範所導致的,上面五條都是使用上的差異而已

7、如何判斷一個div出現在可視區域內(包括在屏幕右邊的情況)
8、瞭解緩存嗎,說說緩存的應用場景
我說了max-age和expiress以及協議緩存,一起說了說。這是自己之前總結的圖
在這裏插入圖片描述
9、寫道算法題,倒數第k個節點,之前寫過,看這篇博客
https://blog.csdn.net/qq_39897978/article/details/104746820
10、一道算法題說說思路
(1)兩個鏈表不知道長度,在某一個節點之後他們是相等的,找出這個節點
我說了思路,先遍歷得到兩個鏈表的長度,算出他門的差x,讓長的向前移動x位,再開始依次遍歷,找到相同的點,輸出,否則就沒有。
(2)使用兩個指針來進行判斷

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */

/**
 * @param {ListNode} headA
 * @param {ListNode} headB
 * @return {ListNode}
 */

var getIntersectionNode = function (headA, headB) {
    if (!headA || !headB) return null
    let A = headA, B = headB;
    while (A !== B) {
        A = A ? A.next : headB;
        B = B ? B.next : headA;
    }
    return A
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章