2022前端面经整理

前言

本篇文章是前端面经题目合集,大部分出自牛客网,答案由我自己理解总结所得。如有错误,请各位大佬指正,避免误导更多的人!!!

还待更新!!!


CSS

CSS优先级

从高到低依次是:

!important>行内样式>ID选择器>类选择器>标签选择器>通配符选择器>继承>浏览器默认样式

JavaScript

new Array(10)

当我们通过单个数字参数的构造器创建数组时,数组的长度为传入的参数,里面的元素为undefined。所以使用push在数组末尾插入元素时,数组的长度会从10变成11。

let arr = new Array(10);//注意,这里代表数组长度为 10
arr.push(1);
arr.slice(0,5);//slice 方法返回一个新数组,不会改变原数组
console.log(arr.length);//11

节流实现

定义:节流指的是n秒内只运行一次,若n秒内重复触发,则只有一次生效。

功能

  • 为了限制函数的执行频次,以优化函数触发频率过高导致的响应速度跟不上触发频率,出现延迟,假死或卡顿的现象。
  • 节约资源
// 定时器
function ttrothle(func,delay){
      let timer=null;
      return function(){
          if(!timer){
              timer=setTimeout(()=>{
                  timer=null;
                  func.apply(this,arguments)
              },delay)
          }
      } 
  }
// 时间差
function ttrothle(func,delay){
      let prev=0;
      return function(){
          let now= Date.now();
          if(now-prev>=delay){
              func.apply(this,arguments);
              prev=now;
          }
      } 
  }

演示例子:

<body>
    <div>
        我是节流处理后的:<input type="text">
    </div> 
    <script>
        function ajax(value){
            console.log('value:'+value+',time:'+Date.now());
        }

        // function ttrothle(func,delay){
        //     let timer=null;
        //     return function(){
        //         if(!timer){
        //             timer=setTimeout(()=>{
        //                 timer=null;
        //                 func.apply(this,arguments)
        //             },delay)
        //         }
        //     } 
        // }

        function ttrothle(func,delay){
            let prev=0;
            return function(){
                let now= Date.now();
                if(now-prev>=delay){
                    func.apply(this,arguments);
                    prev=now;
                }
            } 
        }

        var input = document.querySelector('input')
        let ttrothleHandle=ttrothle(ajax,3000)
        input.addEventListener('keyup',function(e){
            ttrothleHandle(e.target.value)
        })

    </script>   
</body>

es6新增数据类型

BigInt是一种内置对象,它提供了一种方法来表示大于2^53 - 1 的整数。

可以用在一个整数字面量后面加 n 的方式定义一个 BigInt ,如:10n,或者调用函数 BigInt()(但不包含 new 运算符)并传递一个整数值或字符串值。

//const alsoHuge = BigInt(9007199254740991);
// ↪ 9007199254740991n
var bg = 10n
console.log(typeof bg); //bigint

var s=Symbol('joney')
console.log(typeof s); //symbol

transition 如何检测动画结束

transitionend事件会在 CSS transition 结束后触发. 当transition完成前移除transition时,比如移除css的transition-property 属性,事件将不会被触发.如在transition完成前设置 display 为"none",事件同样不会被触发。

function showMessage() {
    console.log('Transition 已完成');
}

var element = document.getElementById("slidingMenu");
element.addEventListener("transitionend", showMessage, false);

讲一下 box-sizing 的值和对应的作用

  • content-box 是默认值。如果你设置一个元素的宽为100px,那么这个元素的内容区会有100px 宽,并且任何边框和内边距的宽度都会被增加到最后绘制出来的元素宽度中。
  • border-box 告诉浏览器:你想要设置的边框和内边距的值是包含在width内的。也就是说,如果你将一个元素的width设为100px,那么这100px会包含它的border和padding,内容区的实际宽度是width减去(border + padding)的值。大多数情况下,这使得我们更容易地设定一个元素的宽高。

水平垂直居中

(1)水平居中:text-align:center;。垂直居中:line-height:XXpx; line-height设置为父盒子的高度。

(2)使用flex实现

  • display: flex;设置 display 属性的值为 flex 将其定义为弹性容器
  • align-items: center;定义项目在交叉轴(纵轴)上如何对齐,垂直对齐居中
  • justify-content: center; 定义了项目在主轴上的对齐方式,水平对齐居中

图片懒加载

提高页面加载渲染速度,进而提高用户体验,减轻服务器的压力。

<script>
    var num = document.getElementsByTagName('img').length;
    var img = document.getElementsByTagName("img");
    var n = 0; //存储图片加载到的位置,避免每次都从第一张图片开始遍历

    lazyload(); //页面载入完毕加载可是区域内的图片
    window.onscroll = lazyload;
    function lazyload() { //监听页面滚动事件
        var seeHeight = document.documentElement.clientHeight; //可见区域高度
        var scrollTop = document.documentElement.scrollTop || document.body.scrollTop; //滚动条距离顶部高度
        for (var i = n; i < num; i++) {
            if (img[i].offsetTop < seeHeight + scrollTop) {
                if (img[i].getAttribute("src") == "default.jpg") {
                    img[i].src = img[i].getAttribute("data-src");
                }
                n = i + 1;
            }
        }
    }
</script>

图片加载抖动

块级元素(如div,p)的padding设置为百分比的时候,是按照容器的宽度来定的

.wrapper{
   width:100%;
   height:0;
   padding-top:24.25%; <--!在这里我们也可以使用padding-bottom属性进行设置--> 
}

promise.then()链式写法

then方法返回的是一个新的Promise实例(不是原来哪个Promise实例!!是一个新的)。 可以使用return传递参数,默认是undefined。

new Promise((resolve, reject) => {
     resolve(123);
 }).then(data => {
     console.log(data); // 123
 }).then(data => {   
     console.log(data);  // undefined
 })

作用域

  let a=10;
   var b=20;
   function fn(){
       console.log('a ',a);  // 10
       console.log('this.a ',this.a); // undefined
       console.log('this.b ',this.b);  // 20
       console.log('b ',b);  // 20
   }
   fn();
  • let m = 10;时输出NaN NaN 6
  • var m = 10;时输出11 11 6
 let m = 10;
 function fn() {
     return this.m + 1;
 }
 var obj = {
     m: 5,
     test1: function() {
         return fn();
     }
 };
 obj.test2 = fn;
 console.log(obj.test1(), fn(), obj.test2())
var obj = {
     m: 5,
     test1: function() {
         console.log(this.m); // 5
         return function (){
             console.log(this.m); //undefined
         }
     }
 };
 obj.test1()();

url 参数提取

decodeURIComponent()方法用于解码由 encodeURIComponent方法或者其它类似方法编码的部分统一资源标识符(URI)。

decodeURIComponent("JavaScript_%D1%88%D0%B5%D0%BB%D0%BB%D1%8B");
// "JavaScript_шеллы"

decodeURI()函数能解码由encodeURI创建或其它流程得到的统一资源标识符(URI)。

const uri = 'https://mozilla.org/?x=шеллы';
const encoded = encodeURI(uri);
console.log(encoded);
// expected output: "https://mozilla.org/?x=%D1%88%D0%B5%D0%BB%D0%BB%D1%8B"

try {
  console.log(decodeURI(encoded));
  // expected output: "https://mozilla.org/?x=шеллы"
} catch (e) { // catches a malformed URI
  console.error(e);
}

<think>我们正在处理用户关于2025年前端面试经验和面试题总结的请求。根据引用内容,我们有一些相关的面试题资料,但需要筛选和整合与前端相关的内容。 引用[1]是关于软件测试的,引用[2]是关于渗透测试的,引用[3]则提供了部分JavaScript面试题(前端相关)。因此,我们将重点参考引用[3]的内容,并补充其他常见的前端面试题。 由于用户要求的是2025年的面试经验,我们可以假设面试题会保持一定的延续性,同时也会有一些新的趋势。我们将结合当(2024年)的前端面试趋势,预测2025年可能重点考察的内容。 前端面试通常包括以下几个部分: 1. JavaScript基础(如引用[3]中提到的类型比较、闭包、异步等) 2. CSS布局和样式 3. 框架(React、Vue、Angular等) 4. 性能优化 5. 网络知识(HTTP、HTTPS、浏览器缓存等) 6. 前端安全 7. 工程化(Webpack、Babel等) 8. 算法与数据结构(通常基础) 我们将按照这些分类整理面试题,并给出参考答案。同时,我们也会参考引用[2]中提到的“表达方式”(如STAR法则)和“技术深度”的要求,在回答中适当体现。 由于回答篇幅限制,我们不可能列出所有面试题,因此会挑选高频和重要的题目。 注意:回答中需要自然地添加引用标识。我们参考了引用[3]的内容,因此会在相关题目后标注。 开始整理: # 2025年前端面试题总结与经验分享 ## 一、JavaScript基础 1. **JavaScript中的基本类型和引用类型有什么区别?** JavaScript有7种基本数据类型:`undefined`、`null`、`boolean`、`number`、`string`、`symbol`(ES6)、`bigint`(ES2020)。基本类型是按值访问的,存储在栈内存中。 引用类型是对象(包括数组、函数等),按引用访问,实际对象存储在堆内存中,变量存储的是对象的地址。 示例: ```javascript let a = 1; let b = a; // b是a的一个副本,值为1 a = 2; console.log(b); // 1,b不受a后续改变的影响 let obj1 = { name: 'Alice' }; let obj2 = obj1; // obj2和obj1指向同一个对象 obj1.name = 'Bob'; console.log(obj2.name); // 'Bob' ``` 引用[3]中提到:JS通过值比较基本类型,通过引用(内存地址)比较对象。因此: ```javascript console.log(1 === 1); // true console.log({} === {}); // false,因为两个空对象地址不同 let c = obj1; console.log(obj1 === c); // true,因为引用相同 ``` 2. **什么是闭包?闭包有什么作用?** 闭包是指函数能够记住并访问其词法作用域,即使函数在其词法作用域之外执行。闭包的形成通常是在一个函数内部定义另一个函数,并返回内部函数。 作用: - 创建私有变量,避免全局污染 - 实现模块化 - 保存状态(例如在函数式编程中) 示例: ```javascript function createCounter() { let count = 0; // 私有变量 return function() { count++; return count; }; } const counter = createCounter(); console.log(counter()); // 1 console.log(counter()); // 2 ``` ## 二、CSS 1. **请解释Flex布局,并举例说明常用属性** Flex布局是一种一维布局模型,提供了更加高效的方式来布局、对齐和分配容器内项目之间的空间。 常用容器属性: - `display: flex;` 定义容器为flex布局 - `flex-direction`:主轴方向(`row`、`column`等) - `justify-content`:主轴对齐方式(`center`、`space-between`等) - `align-items`:交叉轴对齐方式(`center`、`stretch`等) 项目属性: - `flex-grow`:定义项目的放大比例 - `flex-shrink`:定义项目的缩小比例 - `flex-basis`:定义在分配多余空间之,项目占据的主轴空间 示例:水平垂直居中 ```css .container { display: flex; justify-content: center; align-items: center; height: 100vh; } ``` ## 三、框架(以React为例) 1. **React Hooks有哪些?请举例说明useState和useEffect的用法** React Hooks是React 16.8引入的特性,允许在函数组件中使用状态和其他React特性。 - `useState`:用于在函数组件中添加状态。 ```javascript const [count, setCount] = useState(0); // count是状态值,setCount是更新函数 ``` - `useEffect`:处理副作用(如数据获取、订阅等)。 ```javascript useEffect(() => { // 在组件渲染后执行 document.title = `Count: ${count}`; return () => { // 清理函数(在组件卸载或依赖变化时执行) }; }, [count]); // 依赖数组,当count变化时重新执行 ``` ## 四、性能优化 1. **如何优化前端性能?** - 资源压缩(JS、CSS、图片压缩) - 使用CDN加速静态资源 - 懒加载(图片、组件) - 代码分割(Webpack的SplitChunks) - 使用缓存(HTTP缓存、Service Worker) - 减少重绘和回流(如使用transform代替top/left) ## 五、网络 1. **HTTP和HTTPS的区别?** - HTTP是超文本传输协议,明文传输,端口80 - HTTPS是HTTP的安全版,通过SSL/TLS加密,端口443 - HTTPS需要证书(由CA颁发) ## 六、前端安全 1. **什么是XSS攻击?如何防范?** XSS(跨站脚本攻击):攻击者将恶意脚本注入到网页中,当用户浏览时执行。 防范: - 对用户输入进行转义(如`<`转成`<`) - 使用CSP(内容安全策略)限制脚本来源 - 设置HttpOnly属性,防止Cookie被脚本访问 ## 七、工程化 1. **Webpack的loader和plugin有什么区别?** - loader:用于转换特定类型的模块,如将TypeScript转成JavaScript,将SCSS转成CSS。loader在模块加载时工作。 - plugin:解决loader无法解决的问题,功能更强大,如打包优化、资源管理等。plugin在Webpack的整个生命周期中都可以起作用。 ## 八、算法(常见) 1. **实现一个函数,判断一个字符串是否是回文** ```javascript function isPalindrome(str) { const cleanStr = str.replace(/[\W_]/g, '').toLowerCase(); return cleanStr === cleanStr.split('').reverse().join(''); } console.log(isPalindrome('A man, a plan, a canal: Panama')); // true ``` ## 面试经验分享 - **准备项目经验**:使用STAR法则(情境、任务、行动、结果)描述项目经历。 - **关注技术深度**:不仅要会用,还要理解原理(如React的虚拟DOM、Diff算法)。 - **刷题**:算法题(LeetCode简单、中等难度)、前端手写题(如Promise、防抖节流)。 - **了解最新趋势**:关注2025年可能流行的技术(如WebAssembly、Serverless等)。 以上内容结合了当前端面试的常见考点和部分引用内容[^3]。由于面试题会不断更新,建议多渠道收集最新资料。 §§相关问题§§ 1. 2025年前端面试中JavaScript的ES新特性可能会考察哪些? 2. React 18有哪些新特性?在面试中如何回答? 3. 前端性能优化中,如何利用浏览器缓存? 4. 在项目中如何防范XSS攻击?请举例说明。 5. 请解释Webpack的打包过程。</think>### 2025年前端面试题总结与经验分享 前端技术发展迅速,2025年面试将更注重**原理理解、框架深度、性能优化和安全实践**。以下是高频考点和备战建议: --- #### 一、JavaScript核心(占比30%) 1. **类型与引用** - 问题:`console.log([1] === [1]); console.log({} === {})` 输出结果? - 答案:`false`(对象按引用比较)[^3] - 扩展:深拷贝实现(递归、`structuredClone`) 2. **异步与事件循环** ```javascript console.log(1); setTimeout(() => console.log(2), 0); Promise.resolve().then(() => console.log(3)); console.log(4); // 输出:1, 4, 3, 2(微任务优先宏任务) ``` 3. **闭包与内存泄漏** - 场景:循环中绑定事件未解绑,如何用`WeakMap`优化? - 答:利用弱引用自动回收内存。 --- #### 二、框架深度(React/Vue重点,占比40%) 1. **React Hooks原理** - 问题:`useEffect`依赖项为空数组时,何时执行清理函数? - 答:组件卸载时执行(类比`componentWillUnmount`) 2. **Vue响应式原理** ```javascript // 简版实现 const data = { count: 0 }; const dep = new Set(); Object.defineProperty(data, 'count', { get() { dep.add(currentEffect); }, set() { dep.forEach(effect => effect()); } }); ``` 3. **Diff算法优化** - React Fiber:可中断渲染流程 - Vue 3:静态节点提升(PatchFlag) --- #### 三、性能与安全(占比20%) 1. **性能优化** - **LCP优化**:图片懒加载(`IntersectionObserver`)、资源预加载(`<link rel="preload">`) - **防抖节流**:搜索框场景手写实现 2. **安全实践** - **XSS防御**:输入转义(`DOMPurify`库)、CSP策略 - **CSRF防护**:SameSite Cookie、Token验证[^2] --- #### 四、工程化与新技术(占比10%) 1. **Webpack优化** - 提速:缓存(`cache-loader`)、多线程(`thread-loader`) - 分包:`splitChunks`配置策略 2. **趋势技术** - WebAssembly(音视频处理) - 微前端(`qiankun`沙箱原理) --- ### 面试备战建议 1. **原理溯源**: - 阅读框架源码(如React的`ReactFiberWorkLoop.js`) - 理解浏览器渲染流程(关键渲染路径) 2. **项目包装**: - 用STAR法则描述性能优化案例: > **情境**:电商首页加载慢(FCP>3s) > **行动**:图片WebP格式+组件级代码分割 > **结果**:FCP降至1.2s,跳出率降40%[^2] 3. **模拟面试**: - 使用在线平台(如LeetCode、FrontendMasters)刷题 - 参与开源项目积累实操经验 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

焦妮敲代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值