前端面试题
Doctype 的作用是什么?严格模式和混杂模式有什么区别?
DOCTYPE 用于告诉浏览器当前文档应按什么标准解析。
- 严格模式:按标准规范渲染。
- 混杂模式:兼容旧浏览器行为。
如果 DOCTYPE 缺失或写法不规范,浏览器可能进入混杂模式。
行内元素和块级元素有哪些?
常见行内元素:
aspanimginput
常见块级元素:
divpullih1-h6
link 和 @import 有什么区别?
link属于 HTML 标签。@import属于 CSS 语法。link会随页面一起加载。@import通常在页面加载后再处理。link兼容性和可控性通常更好。
常见浏览器内核有哪些?
- IE:Trident
- Firefox:Gecko
- Chrome / 新版 Edge:Blink
- Safari:WebKit
HTML5 有哪些新特性?
常见高频点:
- 语义化标签:
article、section、header、footer - 多媒体:
audio、video - 图形:
canvas - 本地存储:
localStorage、sessionStorage - 地理定位:
Geolocation - 新表单类型和属性
如何理解 HTML 语义化?
语义化就是用正确的标签表达正确的内容结构。
好处:
- 更利于 SEO
- 更利于无障碍访问
- 更方便维护和阅读
cookie、sessionStorage 和 localStorage 的区别是什么?
cookie会随 HTTP 请求发送到服务端。sessionStorage仅在当前会话有效。localStorage持久化更久,浏览器关闭后仍可保留。
通常:
- 登录态、服务端会话相关常涉及
cookie - 前端本地数据缓存常用
localStorage
CSS 选择器优先级如何计算?
通常可以简单记为:
!important > 内联样式 > id > class/属性/伪类 > 标签/伪元素
同优先级下,后定义的样式覆盖先定义的样式。
如何理解 CSS 盒模型?
盒模型由以下部分组成:
contentpaddingbordermargin
标准盒模型里,width/height 只表示 content。
某些浏览器旧行为或 box-sizing: border-box 会改变计算方式。
如何让一个 div 水平居中?
块级元素常见写法:
.box {
width: 200px;
margin: 0 auto;
}如果是更复杂场景,现代布局更常用:
- Flex
- Grid
为什么要做 CSS Reset?
因为不同浏览器对默认样式处理不同。
Reset 或 Normalize 的目的是减少浏览器默认差异,提升跨浏览器一致性。
什么是事件冒泡?如何阻止默认行为和冒泡?
- 事件冒泡:事件从目标元素向上层元素传播。
- 阻止冒泡:
event.stopPropagation() - 阻止默认行为:
event.preventDefault()
旧版 IE 中还有兼容写法需要注意。
call 和 apply 有什么区别?
两者都能改变函数执行时的 this。
区别在参数传递方式:
call(thisArg, a, b, c)apply(thisArg, [a, b, c])
什么是闭包?有什么特点?
闭包是函数和其词法作用域的组合。
常见价值:
- 封装私有变量
- 延长变量生命周期
- 实现函数式编程模式
需要注意:
- 使用不当可能造成内存占用增加
什么是 JSONP?为什么它不是真正的 Ajax?
JSONP 利用了 script 标签可以跨域加载资源的特性。
它不是严格意义上的 Ajax,因为:
- 不是通过
XMLHttpRequest/fetch - 本质上是脚本加载
- 主要用于跨域读取,不支持标准 Ajax 的很多能力
== 和 === 的区别是什么?
==:只比较值,允许类型转换。===:同时比较值和类型。
前端代码里通常更推荐优先使用 ===。
什么是同源策略?
同源策略要求协议、域名、端口三者都相同,浏览器才允许某些资源直接互相访问。
它是浏览器的重要安全机制,用于限制跨站读取。
如何实现数组去重?
现代前端最常见写法:
const result = [...new Set(arr)];什么是优雅降级和渐进增强?
- 渐进增强:先保证基础功能,再向高能力浏览器增强体验。
- 优雅降级:先做完整高级效果,再兼容退化到较低能力环境。
现代前端更常提倡渐进增强。
什么是伪数组?如何转成真正数组?
伪数组指有 length 和索引结构,但不具备真正数组方法的对象,例如:
arguments- DOM 集合
转换方式:
Array.from(obj)
[].slice.call(obj)
[...obj]一次完整的 HTTP 事务大致经历了什么?
简化流程:
- DNS 解析
- 建立连接
- 发送请求
- 服务端处理
- 返回响应
- 浏览器解析与渲染
如果是 HTTPS,还会额外包含 TLS 握手过程。
如何手写数组快速排序?
快速排序核心是:
- 选择基准值
- 把数组分成小于基准和大于基准两部分
- 递归处理左右子数组
平均时间复杂度是 O(n log n)。
评论
使用 GitHub 账号即可参与加载较慢?可 直接前往 GitHub Discussions 查看与参与。