前端初级面试20道核心题+详细思路解析

news/2025/3/31 9:13:53/
htmledit_views">

一、HTML/CSS 基础篇

1. 如何让一个 div 水平居中?至少写出 3 种方法

答题思路

  • 方法1margin: 0 auto; + 设置宽度(块级元素)。
  • 方法2:父级 text-align: center;,子级 display: inline-block;
  • 方法3:Flex 布局,父级 display: flex; justify-content: center;

2. CSS 中隐藏元素的方法有哪些?区别是什么?

答题思路

  • ​**display: none**:元素不占据空间,无法触发点击事件。
  • ​**visibility: hidden**:元素占据空间,但不可见,无法触发事件。
  • ​**opacity: 0:元素透明且占据空间,​可以触发事件**。

3. 什么是 CSS 盒模型?如何设置怪异盒模型?

答题思路

  • 标准盒模型width = content,总宽度 = width + padding + border
  • 怪异盒模型width = content + padding + border,通过 box-sizing: border-box; 设置。

4. 如何实现两栏布局(左侧固定宽度,右侧自适应)?

答题思路

  • Flex 布局:父级 display: flex;,左侧定宽,右侧 flex: 1;
  • 浮动布局:左侧 float: left; width: 200px;,右侧 margin-left: 200px;
  • Grid 布局:父级 display: grid; grid-template-columns: 200px 1fr;

5. 如何实现一个三角形?

答题思路
利用 border 属性:

css

.triangle {  width: 0;  height: 0;  border-left: 50px solid transparent;  border-right: 50px solid transparent;  border-bottom: 100px solid red;  
}  

二、JavaScript 核心篇

6. 如何判断一个变量的类型?typeof 和 instanceof 的区别?

答题思路

  • ​**typeof**:返回基本类型(string/number/boolean),但 typeof null 返回 "object"
  • ​**instanceof**:判断对象类型(如 [] instanceof Array)。
  • ​**Object.prototype.toString.call()**:万能方法(如 [object Array])。

7. 什么是闭包?写一个闭包的例子

答题思路
闭包是函数嵌套时,内部函数引用外部函数变量的机制。

javascript

function outer() {  let count = 0;  function inner() {  count++;  console.log(count);  }  return inner;  
}  
const fn = outer();  
fn(); // 1  
fn(); // 2  

应用场景:计数器、防抖节流、模块化封装。


8. 如何实现数组去重?至少写出 2 种方法

答题思路

  • Set 去重[...new Set(arr)]
  • filter + indexOf

    javascript

    arr.filter((item, index) => arr.indexOf(item) === index);  

9. 什么是事件冒泡和事件捕获?如何阻止事件冒泡?

答题思路

  • 事件冒泡:事件从目标元素向上传播到根节点(默认)。
  • 事件捕获:事件从根节点向下传播到目标元素。
  • 阻止冒泡event.stopPropagation()

10. 什么是 Promise?如何解决回调地狱?

答题思路

  • Promise:表示异步操作的最终完成或失败,支持链式调用。
  • 解决回调地狱

    javascript

    fetchData()  .then(data => processData(data))  .then(result => displayResult(result))  .catch(error => console.error(error));  

三、浏览器与网络篇

11. 从输入 URL 到页面展示发生了什么?

答题思路

  1. DNS 解析:将域名转换为 IP 地址。
  2. TCP 连接:三次握手建立连接。
  3. 发送 HTTP 请求:浏览器发送请求报文。
  4. 服务器处理并返回响应
  5. 浏览器解析 HTML/CSS,构建 DOM 树和渲染树
  6. 布局(Layout)和绘制(Paint)​

12. 什么是跨域?如何解决跨域问题?

答题思路

  • 跨域:协议、域名、端口不一致导致的请求限制。
  • 解决方案
    • CORS:服务端设置 Access-Control-Allow-Origin: *
    • JSONP:通过 <script> 标签跨域请求(仅 GET)。

13. Cookie、LocalStorage、SessionStorage 的区别?

答题思路

CookieLocalStorageSessionStorage
容量4KB5MB5MB
生命周期可设置过期时间永久会话结束销毁
通信每次请求携带不参与不参与

14. 什么是事件循环(Event Loop)?

答题思路

  • 宏任务scriptsetTimeoutsetInterval
  • 微任务Promise.thenMutationObserver
  • 执行顺序:宏任务 → 微任务 → 渲染 → 下一轮宏任务。

15. 如何优化页面加载速度?

答题思路

  • 减少资源体积:压缩代码、图片转 WebP。
  • 使用 CDN:加速静态资源加载。
  • 懒加载:图片/组件按需加载。

四、手写代码与场景题

16. 手写深拷贝函数

答题思路

javascript

function deepClone(obj) {  if (typeof obj !== 'object' || obj === null) return obj;  const result = Array.isArray(obj) ? [] : {};  for (let key in obj) {  if (obj.hasOwnProperty(key)) {  result[key] = deepClone(obj[key]);  }  }  return result;  
}  

17. 手写数组扁平化函数

答题思路

javascript

function flatten(arr) {  return arr.reduce((prev, curr) => {  return prev.concat(Array.isArray(curr) ? flatten(curr) : curr);  }, []);  
}  

18. 实现一个防抖函数(Debounce)​

答题思路

javascript

function debounce(fn, delay) {  let timer;  return (...args) => {  clearTimeout(timer);  timer = setTimeout(() => fn(...args), delay);  };  
}  

19. 如何实现一个简单的发布-订阅模式?

答题思路

javascript

class EventEmitter {  constructor() { this.events = {}; }  on(event, callback) {  if (!this.events[event]) this.events[event] = [];  this.events[event].push(callback);  }  emit(event, ...args) {  this.events[event]?.forEach(cb => cb(...args));  }  
}  

20. 实现一个函数,判断变量是否为对象

答题思路

javascript

function isObject(obj) {  return obj !== null && (typeof obj === 'object' || typeof obj === 'function');  
}  

http://www.ppmy.cn/news/1583723.html

相关文章

ArkUI之常见基本布局(下)

6.轮播(Swiper) 1.概述 Swiper组件提供滑动轮播显示的能力。Swiper本身是一个容器组件&#xff0c;当设置了多个子组件后&#xff0c;可以对这些子组件进行轮播显示。通常&#xff0c;在一些应用首页显示推荐的内容时&#xff0c;需要用到轮播显示的能力。 针对复杂页面场景…

Modbus协议编程读写流程图大全

读离散量输入 读保持寄存器 读输入寄存器 写单个线圈 写单个寄存器 写多个线圈 写多个寄存器 (0x14) 读文件记录 写文件记录 (0x16) 屏蔽写寄存器 (0x17) 读/写多个寄存器

c++图论(六)之字典序最小欧拉路

要找到字典序最小的欧拉路径,可以采用以下步骤: 确定是否存在欧拉路径: 对于无向图,检查所有顶点的度数。若存在0个奇数度数的顶点,则为欧拉回路;若存在2个奇数度数的顶点,则为欧拉路径,否则不存在。选择起点: 若存在两个奇数度数顶点,选择编号较小的作为起点。若为欧…

基于YOLOv8深度学习的PCB缺陷检测识别系统【python源码+GUI界面+数据集+训练代码+登录界面】

目录 一、界面全貌展示 二、前言摘要 三、GUI界面演示 &#xff08;一&#xff09;用户加载自定义模型 &#xff08;二&#xff09;单张图像检测 &#xff08;三&#xff09;检测图像文件夹 &#xff08;四&#xff09;检测视频 &#xff08;五&#xff09;摄像头检测 …

UI前端与数字孪生:打造智慧城市的双引擎

hello宝子们...我们是艾斯视觉擅长ui设计和前端数字孪生、大数据、三维建模、三维动画10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩! 随着信息技术的飞速发展&#xff0c;智慧城市的概念逐渐从理论走向实践。智慧城市旨在通过运用物联网…

使用 Chromedp 监听网页请求和响应

使用 Chromedp 监听网页请求和响应 在进行网络爬虫的时候&#xff0c;有很多网站都有反爬机制&#xff0c;比如你想抓点数据&#xff0c;结果发现每次请求都带一堆奇奇怪怪的参数 —— 什么 timestamp 签名、AES 加密的字段&#xff0c;还有各种 Token 令牌&#xff0c;跟密码…

如何在Webpack中配置别名路径?

如何在Webpack中配置别名路径&#xff1f; 文章目录 如何在Webpack中配置别名路径&#xff1f;1. 引言2. 配置别名路径的基本原理3. 如何配置别名路径3.1 基本配置3.2 结合Babel与TypeScript3.2.1 Babel配置3.2.2 TypeScript配置 3.3 适用场景与最佳实践 4. 调试与常见问题4.1 …

【银河麒麟系统常识】命令:uname -m(查看系统架构)

命令&#xff1a; uname -m 功能 常用的 Linux/Unix 终端命令&#xff0c;用于显示当前系统的硬件架构&#xff1b; 返回 返回系统的CPU架构类型&#xff0c;用于判断软件兼容性&#xff1b; 输出结果架构说明常见设备x86_64Intel/AMD 64位 CPU主流 PC、服务器aarch64ARM 64位 …