主頁 > 企業開發 > 前端常見面試題

前端常見面試題

2021-10-15 18:05:47 企業開發

1.關于防抖/節流

題目要求很明確,要求最終輸出“searchText1”,并且在500ms后輸出“searchText7”,很明顯就是關于同一個函式在短時間內重復呼叫,如何限制其呼叫頻率的功能實作,

 1     function throttle(action, threshold) {
 2         // TODO:
 3     }
 4 
 5     let timer = true;
 6     const triggerScroll = throttle((val) => {
 7         console.log(val);
 8     }, 300);
 9 
10     triggerScroll("searchText1");
11     triggerScroll("searchText2");
12     triggerScroll("searchText3");
13     triggerScroll("searchText4");
14     triggerScroll("searchText5");
15     triggerScroll("searchText6");
16 
17     setTimeout(() => {}, 500);
18 
19     // 期望輸出結果:
20     // searchText1
21     // 500ms 后輸出 searchText7

首先,拿到題目后我們先運行一下,運行后報錯,顯示“triggerScroll is not a function”;由于題目中throttle函式沒有回傳值,所以triggerScroll接收到的throttle回傳值為undefined,首先我們要在throttle函式中return一個函式,也就是throttle在呼叫時傳進去的第一個引數,

1  function throttle(action, threshold) {
2     return action
3  }

這時再運行,控制臺列印“searchText1-6”;這時我們只需要把防抖的通用模板套進去就可以實作了,我這里用的防抖,其實使用節流函式也是可以實作的,原理相同,我這里就不展示了,完整代碼如下:

 1     function throttle(action, threshold) {
 2         return action
 3     }
 4 
 5     let timer = true;
 6     const triggerScroll = throttle((val) => {
 7         if (timer) {
 8             timer = false;
 9             setTimeout(() => {
10                 timer = true;
11                 console.log(val);
12             }, 300)
13         } else {
14             return false;
15         }
16     }, 300);
17 
18     triggerScroll("searchText1");
19     triggerScroll("searchText2");
20     triggerScroll("searchText3");
21     triggerScroll("searchText4");
22     triggerScroll("searchText5");
23     triggerScroll("searchText6");
24 
25     setTimeout(() => {
26         triggerScroll("searchText7");
27     }, 500);

另附上防抖和節流的通用模板:

//防抖
let timeid = null;
function debounce() {
    if (timeid) {
        clearTimeout(timeid);
    }
    timeid = setTimeout(() => {
        //這里寫操作
        console.log(Math.random());
    }, 500);

}
window.onscroll = debounce;//視窗滾動事件防抖
//節流
let timeid = null;
function debounce(func, wait = 0) {
    if (!timeid) {
        timeid = setTimeout(() => {
            console.log(Math.random());
            timeid = null;
        }, 500);
    }
}
window.onscroll = debounce;

 2.js預編譯以及運行流程

最終輸出結果為“1 1 2 0”,這一題也會涉及到閉包,作用域等知識點,

 1 var i = 0;
 2 function fn() {
 3     i = 1;
 4     console.log(i);
 5     var i;
 6     return function () {
 7         console.log(i);
 8         i += 1;
 9     }
10 }
11 
12 var fun = fn();//1
13 fun();//1
14 fun();//2
15 console.log(i);//0

首先我們需要了解js運行流程:首先進行語法決議;先通篇的檢查js語法,若語法有誤,則報錯,其實進行預編譯;即發生在代碼執行之前,為代碼的執行做的準備作業,一般表現于變數提升,即把變數的宣告提前,但是賦值還是在回應位置賦值,再者就是把整個函式宣告提前,最后js運行流程進入最后一步即決議執行,

搞懂js運行流程再區分作用域,即全域作用域和函式作用域,全域作用域顧名思義就是全域宣告的變數或函式等,函式作用域也就是函式內部的作用域,在函式內部中宣告的變數或函式是不會傳到全域作用域的,

搞懂這兩個概念這一題就能夠迎刃而解了,首先全域宣告了一個變數i并賦值為0,在宣告一個fun接受fn執行后的回傳值,所以fn會執行一次,區域變數i在fn函式中重新宣告,變數提升,這時函式fn中使用的i都為函式作用域中宣告的i,并且重新賦值為1,輸出結果1,這里不會影響到全域變數i的值,再觀望整體代碼,全域變數i未被重新賦值,所以最后一行i輸出為0.

再往下走,fu函式的回傳值也是一個函式,所以fun接收到的是一個函式,fun函式被執行兩次,注意到在fn函式中,i被重新宣告過,所以這里的回傳值函式即fun函式的作用域為區域作用域,使用的變數i為區域變數,即再fn函式中宣告的i,所以輸出1,輸出之后i自增1,即 i = i+1,區域作用域i的值在fun函式弟一次執行后變為2,再次執行后,輸出i為2,


3.值型別和參考型別

這一題主要涉及到值型別和參考型別的存盤方式,即堆記憶體和堆疊記憶體,

1 function fn(obj) {
2     obj.name = "name";
3     obj = new Object();
4     obj.name = "newName";
5 }
6 var xt = new Object();
7 fn(xt);
8 console.log(xt.name);//name

首先題目中宣告了一個函式fn和一個物件xt,呼叫fn函式,并把xt傳入函式,這是第二行的obj和xt都為參考型別,新增了obj的屬性name值也為name,由于此時obj和xt指向的同一片記憶體空間,所以xt也會新增name屬性,并設定值為name,故最后一個輸出name,

在第三行中可以看到obj被重新賦值,即重新開辟了一片記憶體空間,這時obj依然為新增name屬性而不是修改name屬性,并將name屬性設定為newName,所以這是obj新增的屬性不會影響到物件xt的屬性,


4.同步和異步

這一題主要是考察異步代碼和同步代碼執行的先后順序以及js任務佇列,

 1    for (let index = 0; index < 5; index++) {
 2         setTimeout(() => {
 3             console.log(index);
 4         }, 200);
 5     }
 6 
 7     for (let j = 0; j < 5; j++) {
 8         setTimeout(() => {
 9             console.log(j);
10         }, 200);
11     }

首先可以看到題目中有兩個回圈體,兩個回圈體中分別有兩個延時200ms的延時器,做題之前我們應該先了解到JavaScript對于同步代碼和異步代碼的處理方式,js會先執行同步代碼,遇到異步代碼(例:延時器、計時器、Promise等)會先放置任務佇列,等待觸發條件依次執行,這個概念了解清楚后這題就能夠迎刃而解了,

首先兩個回圈體為同步代碼,會先執行,此時第一個回圈體會將回圈出的五個延時器放置任務佇列,等待200ms后執行,第二個回圈體也是如此,所以輸出為“0 1 2 3 4  0 1 2 3 4”,


5.宏任務和微任務

此題主要是考察對于同步異步,以及宏任務和微任務的理解,

//寫出執行結果
setTimeout(() => {
    console.log(1);
}, 0);

new Promise((res) => {
    console.log(2);
    for (var index = 0; index < 1000; index++) {
        index = 9999 && res()

    }
    console.log(3);
}).then(() => {
    console.log(4);
})
console.log(5);

此題最終輸出結果為“2 3 5 4 1”;

解答此題我們需要先了解到Promise的特性,Promise是異步編程的一種解決方案,是解決恐怖回呼/回呼噩夢的一種方案,其就相當于一個容器,里面保存著某個未來才會結束的事件(通常是一個異步操作)的結果,

創建promise物件,function就相當于容器,用于存放異步代碼(不僅限于異步,同步也可以),此函式在頁面加載時會正常執行,同步代碼會進入主執行緒執行,異步代碼會進入任務佇列,未來才會得到結果,并且Promise有三種狀態,進行時(pending默認值),已成功(fulfilled/resolved),已失敗(rejected)一旦狀態改變,就不會再變,任何時候都可以得到這個結果,成功后會呼叫.then()方法,then方法接受兩個引數,皆為回呼函式,第一個函式promise狀態變為已成功時觸發的,第二個函式promise狀態變為已失敗時觸發,

了解了Promise后,我們還需要搞清楚宏任務和微任務的概念,在上面我們提到過,js會見異步代碼放置任務佇列,宏任務是由宿主(Node、瀏覽器)發起的,常見的就是計時器和延時器;而微任務是由js引擎發起的,常見的就時Promise;執行順序為微任務先執行,宏任務后執行,

這時我們就可以來解答這個題目了,首先遇到延時器,為宏任務,放入任務佇列,其實遇到promise,先執行promise的同步代碼,輸出2,再進入回圈,第一次進入回圈index被重新賦值為9999,并且將promise的狀態改為已成功,再往下走輸出3;

此時promise狀態為已成功,觸發then方法的第一個函式,但是promise回應為異步回應,并且為微任務,放置任務佇列,排在宏任務之前,再往下走就輸出5,

此時同步代碼執行完畢,開始執行異步代碼,先執行微任務,輸出4,在執行延時器代碼,輸出5,


好啦,以上就是小譚今天分享的內容啦,也歡迎各位一起來討論技術呀!文章中有不足的地方小譚也歡迎各位指正探討,不勝感激!

轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/315996.html

標籤:其他

上一篇:簡述JS正則RegExp物件

下一篇:深入理解margin屬性

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • IEEE1588PTP在數字化變電站時鐘同步方面的應用

    IEEE1588ptp在數字化變電站時鐘同步方面的應用 京準電子科技官微——ahjzsz 一、電力系統時間同步基本概況 隨著對IEC 61850標準研究的不斷深入,國內外學者提出基于IEC61850通信標準體系建設數字化變電站的發展思路。數字化變電站與常規變電站的顯著區別在于程序層傳統的電流/電壓互 ......

    uj5u.com 2020-09-10 03:51:52 more
  • HTTP request smuggling CL.TE

    CL.TE 簡介 前端通過Content-Length處理請求,通過反向代理或者負載均衡將請求轉發到后端,后端Transfer-Encoding優先級較高,以TE處理請求造成安全問題。 檢測 發送如下資料包 POST / HTTP/1.1 Host: ac391f7e1e9af821806e890 ......

    uj5u.com 2020-09-10 03:52:11 more
  • 網路滲透資料大全單——漏洞庫篇

    網路滲透資料大全單——漏洞庫篇漏洞庫 NVD ——美國國家漏洞庫 →http://nvd.nist.gov/。 CERT ——美國國家應急回應中心 →https://www.us-cert.gov/ OSVDB ——開源漏洞庫 →http://osvdb.org Bugtraq ——賽門鐵克 →ht ......

    uj5u.com 2020-09-10 03:52:15 more
  • 京準講述NTP時鐘服務器應用及原理

    京準講述NTP時鐘服務器應用及原理京準講述NTP時鐘服務器應用及原理 安徽京準電子科技官微——ahjzsz 北斗授時原理 授時是指接識訓通過某種方式獲得本地時間與北斗標準時間的鐘差,然后調整本地時鐘使時差控制在一定的精度范圍內。 衛星導航系統通常由三部分組成:導航授時衛星、地面檢測校正維護系統和用戶 ......

    uj5u.com 2020-09-10 03:52:25 more
  • 利用北斗衛星系統設計NTP網路時間服務器

    利用北斗衛星系統設計NTP網路時間服務器 利用北斗衛星系統設計NTP網路時間服務器 安徽京準電子科技官微——ahjzsz 概述 NTP網路時間服務器是一款支持NTP和SNTP網路時間同步協議,高精度、大容量、高品質的高科技時鐘產品。 NTP網路時間服務器設備采用冗余架構設計,高精度時鐘直接來源于北斗 ......

    uj5u.com 2020-09-10 03:52:35 more
  • 詳細解讀電力系統各種對時方式

    詳細解讀電力系統各種對時方式 詳細解讀電力系統各種對時方式 安徽京準電子科技官微——ahjzsz,更多資料請添加VX 衛星同步時鐘是我京準公司開發研制的應用衛星授時時技術的標準時間顯示和發送的裝置,該裝置以M國全球定位系統(GLOBAL POSITIONING SYSTEM,縮寫為GPS)或者我國北 ......

    uj5u.com 2020-09-10 03:52:45 more
  • 如何保證外包團隊接入企業內網安全

    不管企業規模的大小,只要企業想省錢,那么企業的某些服務就一定會采用外包的形式,然而看似美好又經濟的策略,其實也有不好的一面。下面我通過安全的角度來聊聊使用外包團的安全隱患問題。 先看看什么服務會使用外包的,最常見的就是話務/客服這種需要大量重復性、無技術性的服務,或者是一些銷售外包、特殊的職能外包等 ......

    uj5u.com 2020-09-10 03:52:57 more
  • PHP漏洞之【整型數字型SQL注入】

    0x01 什么是SQL注入 SQL是一種注入攻擊,通過前端帶入后端資料庫進行惡意的SQL陳述句查詢。 0x02 SQL整型注入原理 SQL注入一般發生在動態網站URL地址里,當然也會發生在其它地發,如登錄框等等也會存在注入,只要是和資料庫打交道的地方都有可能存在。 如這里http://192.168. ......

    uj5u.com 2020-09-10 03:55:40 more
  • [GXYCTF2019]禁止套娃

    git泄露獲取原始碼 使用GET傳參,引數為exp 經過三層過濾執行 第一層過濾偽協議,第二層過濾帶引數的函式,第三層過濾一些函式 preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'] (?R)參考當前正則運算式,相當于匹配函式里的引數 因此傳遞 ......

    uj5u.com 2020-09-10 03:56:07 more
  • 等保2.0實施流程

    流程 結論 ......

    uj5u.com 2020-09-10 03:56:16 more
最新发布
  • 使用Django Rest framework搭建Blog

    在前面的Blog例子中我們使用的是GraphQL, 雖然GraphQL的使用處于上升趨勢,但是Rest API還是使用的更廣泛一些. 所以還是決定回到傳統的rest api framework上來, Django rest framework的官網上給了一個很好用的QuickStart, 我參考Qu ......

    uj5u.com 2023-04-20 08:17:54 more
  • 記錄-new Date() 我忍你很久了!

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 大家平時在開發的時候有沒被new Date()折磨過?就是它的諸多怪異的設定讓你每每用的時候,都可能不小心踩坑。造成程式意外出錯,卻一下子找不到問題出處,那叫一個煩透了…… 下面,我就列舉它的“四宗罪”及應用思考 可惡的四宗罪 1. Sa ......

    uj5u.com 2023-04-20 08:17:47 more
  • 使用Vue.js實作文字跑馬燈效果

    實作文字跑馬燈效果,首先用到 substring()截取 和 setInterval計時器 clearInterval()清除計時器 效果如下: 實作代碼如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta ......

    uj5u.com 2023-04-20 08:12:31 more
  • JavaScript 運算子

    JavaScript 運算子/運算子 在 JavaScript 中,有一些運算子可以使代碼更簡潔、易讀和高效。以下是一些常見的運算子: 1、可選鏈運算子(optional chaining operator) ?.是可選鏈運算子(optional chaining operator)。?. 可選鏈操 ......

    uj5u.com 2023-04-20 08:02:25 more
  • CSS—相對單位rem

    一、概述 rem是一個相對長度單位,它的單位長度取決于根標簽html的字體尺寸。rem即root em的意思,中文翻譯為根em。瀏覽器的文本尺寸一般默認為16px,即默認情況下: 1rem = 16px rem布局原理:根據CSS媒體查詢功能,更改根標簽的字體尺寸,實作rem單位隨螢屏尺寸的變化,如 ......

    uj5u.com 2023-04-20 08:02:21 more
  • 我的第一個NPM包:panghu-planebattle-esm(胖虎飛機大戰)使用說明

    好家伙,我的包終于開發完啦 歡迎使用胖虎的飛機大戰包!! 為你的主頁添加色彩 這是一個有趣的網頁小游戲包,使用canvas和js開發 使用ES6模塊化開發 效果圖如下: (覺得圖片太sb的可以自己改) 代碼已開源!! Git: https://gitee.com/tang-and-han-dynas ......

    uj5u.com 2023-04-20 08:01:50 more
  • 如何在 vue3 中使用 jsx/tsx?

    我們都知道,通常情況下我們使用 vue 大多都是用的 SFC(Signle File Component)單檔案組件模式,即一個組件就是一個檔案,但其實 Vue 也是支持使用 JSX 來撰寫組件的。這里不討論 SFC 和 JSX 的好壞,這個仁者見仁智者見智。本篇文章旨在帶領大家快速了解和使用 Vu ......

    uj5u.com 2023-04-20 08:01:37 more
  • 【Vue2.x原始碼系列06】計算屬性computed原理

    本章目標:計算屬性是如何實作的?計算屬性快取原理以及洋蔥模型的應用?在初始化Vue實體時,我們會給每個計算屬性都創建一個對應watcher,我們稱之為計算屬性watcher ......

    uj5u.com 2023-04-20 08:01:31 more
  • http1.1與http2.0

    一、http是什么 通俗來講,http就是計算機通過網路進行通信的規則,是一個基于請求與回應,無狀態的,應用層協議。常用于TCP/IP協議傳輸資料。目前任何終端之間任何一種通信方式都必須按Http協議進行,否則無法連接。tcp(三次握手,四次揮手)。 請求與回應:客戶端請求、服務端回應資料。 無狀態 ......

    uj5u.com 2023-04-20 08:01:10 more
  • http1.1與http2.0

    一、http是什么 通俗來講,http就是計算機通過網路進行通信的規則,是一個基于請求與回應,無狀態的,應用層協議。常用于TCP/IP協議傳輸資料。目前任何終端之間任何一種通信方式都必須按Http協議進行,否則無法連接。tcp(三次握手,四次揮手)。 請求與回應:客戶端請求、服務端回應資料。 無狀態 ......

    uj5u.com 2023-04-20 08:00:32 more