1. JS由哪三部分組成?
- ECMAScript:核心語法和規(guī)則
- DOM(文檔對象模型):操作HTML文檔的接口
- BOM(瀏覽器對象模型):與瀏覽器交互的接口
2. JS有哪些內(nèi)置對象?
- 基本對象:Object、Function、Array、String、Number、Boolean、Date、RegExp
- 錯誤對象:Error、EvalError、RangeError等
- 全局對象:Math、JSON
- 其他:Symbol、Map、Set、Promise等
3. 操作數(shù)組的方法有哪些?
- 修改原數(shù)組:push、pop、shift、unshift、splice、sort、reverse
- 不修改原數(shù)組:concat、slice、map、filter、reduce、forEach
- 查找:indexOf、lastIndexOf、find、findIndex
4. JS對數(shù)據(jù)類型的檢測方式有哪些?
- typeof:檢測基本數(shù)據(jù)類型
- instanceof:檢測對象類型
- constructor:通過構(gòu)造函數(shù)判斷
- Object.prototype.toString.call():最準(zhǔn)確的檢測方法
5. 說一下閉包,閉包有什么特點(diǎn)?
- 定義:函數(shù)可以訪問并操作其外部作用域中的變量
-
特點(diǎn):
- 可以訪問外部函數(shù)的變量
- 變量不會被垃圾回收
- 可以創(chuàng)建私有變量
6. 前端的內(nèi)存泄漏怎么理解?
- 定義:程序中已動態(tài)分配的堆內(nèi)存由于某種原因未釋放或無法釋放
-
常見原因:
- 意外的全局變量
- 被遺忘的定時器
- 未清理的DOM引用
- 閉包使用不當(dāng)
7. 事件委托是什么?
- 概念:利用事件冒泡機(jī)制,將事件監(jiān)聽器添加到父元素上,通過事件冒泡來處理子元素的事件
- 優(yōu)點(diǎn):減少內(nèi)存占用、動態(tài)綁定事件
8. 基本數(shù)據(jù)類型和引用數(shù)據(jù)類型的區(qū)別?
- 基本類型:存儲在棧中,值不可變,賦值時拷貝值
- 引用類型:存儲在堆中,賦值時拷貝引用地址
9. 說一下原型鏈。
- 概念:每個對象都有一個內(nèi)部屬性[[Prototype]],指向其原型對象,形成鏈?zhǔn)浇Y(jié)構(gòu)
- 作用:實(shí)現(xiàn)屬性和方法的繼承
10. new操作符具體做了什么?
- 創(chuàng)建一個空對象
- 設(shè)置原型鏈
- 執(zhí)行構(gòu)造函數(shù)
- 返回對象
11. JS是如何實(shí)現(xiàn)繼承的?
- 原型鏈繼承
- 構(gòu)造函數(shù)繼承
- 組合繼承
- 寄生組合繼承
- ES6 Class繼承
12. JS的設(shè)計(jì)原理是什么?
- 基于原型的面向?qū)ο?/li>
- 單線程事件循環(huán)
- 動態(tài)類型
- 函數(shù)是一等公民
13. JS中關(guān)于this指向的問題
- 全局環(huán)境:指向全局對象
- 函數(shù)調(diào)用:非嚴(yán)格模式指向全局對象,嚴(yán)格模式為undefined
- 對象方法:指向調(diào)用對象
- 構(gòu)造函數(shù):指向?qū)嵗龑ο?/li>
- 箭頭函數(shù):繼承外層作用域的this
14. script標(biāo)簽里的async和defer有什么區(qū)別?
- async:異步加載,加載完立即執(zhí)行
- defer:異步加載,等待DOM解析完成后執(zhí)行
15. setTimeout最小執(zhí)行時間是多少?
- HTML5標(biāo)準(zhǔn)規(guī)定為4ms,但實(shí)際瀏覽器實(shí)現(xiàn)可能不同
16. ES6和ES5有什么區(qū)別?
- ES6引入了let/const、箭頭函數(shù)、類、模塊等新特性
- 語法更簡潔,功能更強(qiáng)大
17. ES6的新特性有哪些?
- let/const
- 箭頭函數(shù)
- 模板字符串
- 解構(gòu)賦值
- Promise
- Class
- Module
18. call, apply, bind三者有什么區(qū)別?
- call:立即執(zhí)行,參數(shù)逐個傳遞
- apply:立即執(zhí)行,參數(shù)以數(shù)組形式傳遞
- bind:返回新函數(shù),不立即執(zhí)行
19. 用遞歸的時候有沒有遇到什么問題?
- 棧溢出
- 重復(fù)計(jì)算
- 性能問題
20. 如何實(shí)現(xiàn)一個深拷貝?
// 使用JSON.parse(JSON.stringify())
// 使用遞歸實(shí)現(xiàn)
// 使用lodash的cloneDeep
21. 說一下事件循環(huán)。
- 概念:JavaScript處理異步任務(wù)的機(jī)制
- 流程:執(zhí)行棧 → 微任務(wù)隊(duì)列 → 宏任務(wù)隊(duì)列
22. ajax是什么?怎么實(shí)現(xiàn)的?
- 定義:異步JavaScript和XML,用于在后臺與服務(wù)器交換數(shù)據(jù)
- 實(shí)現(xiàn):XMLHttpRequest或fetch API
23. get和post有什么區(qū)別?
- GET:參數(shù)在URL中,長度限制,可緩存
- POST:參數(shù)在請求體中,無長度限制,不可緩存
24. promise的內(nèi)部原理是什么?它的優(yōu)缺點(diǎn)是什么?
- 原理:狀態(tài)機(jī)(pending、fulfilled、rejected)
- 優(yōu)點(diǎn):解決回調(diào)地獄
- 缺點(diǎn):無法取消,錯誤處理復(fù)雜
25. promise和async await的區(qū)別是什么?
- Promise:鏈?zhǔn)秸{(diào)用
- async/await:同步寫法,更易讀
26. 瀏覽器的存儲方式有哪些?
- localStorage
- sessionStorage
- cookie
- indexedDB
27. token存在sessionstorage還是localstorage?
- 通常存在localStorage中,但需考慮安全因素
28. token的登錄流程。
- 用戶登錄
- 服務(wù)器驗(yàn)證并返回token
- 客戶端存儲token
- 后續(xù)請求攜帶token
29. 頁面渲染的過程是怎樣的?
- 解析HTML構(gòu)建DOM樹
- 解析CSS構(gòu)建樣式樹
- 合并DOM樹和樣式樹構(gòu)建渲染樹
- 布局計(jì)算
- 繪制
30. DOM樹和渲染樹有什么區(qū)別?
- DOM樹:完整的HTML結(jié)構(gòu)
- 渲染樹:只包含可見元素,包含樣式信息
31. 精靈圖和base64的區(qū)別是什么?
- 精靈圖:將多個小圖合并為一張大圖
- base64:將圖片轉(zhuǎn)換為文本編碼
32. svg格式了解多少?
- 矢量圖形格式
- 基于XML
- 可縮放不失真
- 支持動畫和交互
33. 了解過JWT嗎?
- 定義:JSON Web Token,用于身份驗(yàn)證
- 結(jié)構(gòu):頭部.載荷.簽名
34. npm的底層環(huán)境是什么?
- 基于Node.js的包管理器
35. HTTP協(xié)議規(guī)定的協(xié)議頭和請求頭有什么?
- 請求頭:User-Agent、Content-Type等
- 響應(yīng)頭:Content-Type、Cache-Control等
36. 說一下瀏覽器的緩存策略。
- 強(qiáng)緩存:Expires、Cache-Control
- 協(xié)商緩存:Last-Modified/If-Modified-Since、ETag/If-None-Match
37. 說一下什么是"同源策略"?
- 定義:協(xié)議、域名、端口都相同才允許通信
- 目的:防止惡意網(wǎng)站竊取數(shù)據(jù)
38. 防抖和節(jié)流是什么?
- 防抖:事件觸發(fā)后延遲執(zhí)行,新事件會重置延遲
- 節(jié)流:固定時間間隔內(nèi)只執(zhí)行一次
39. 解釋一下什么是json?
- 定義:JavaScript對象表示法,輕量級數(shù)據(jù)交換格式
- 特點(diǎn):易于人閱讀和編寫,機(jī)器解析和生成
40. 當(dāng)數(shù)據(jù)沒有請求過來的時候,該怎么做?
- 顯示loading狀態(tài)
- 提供默認(rèn)值
- 錯誤處理和重試機(jī)制
41. 有沒有做過無感登錄?
- 通過token自動刷新實(shí)現(xiàn)
- 利用localStorage存儲用戶信息
42. 大文件上傳是怎么做的?
- 分片上傳
- 斷點(diǎn)續(xù)傳
- 并行上傳多個分片