前端实习生必看:从亚信笔试高频错题,拆解CSS3伪类和Vue通信的5个易混点

张开发
2026/6/9 11:00:20 15 分钟阅读

分享文章

前端实习生必看:从亚信笔试高频错题,拆解CSS3伪类和Vue通信的5个易混点
前端实习生必看从亚信笔试高频错题拆解CSS3伪类和Vue通信的5个易混点最近在辅导几位准备前端实习面试的同学时发现他们在复盘亚信等大厂笔试错题时总会在CSS3伪类选择和Vue组件通信这几个知识点上反复栽跟头。这让我想起自己当年面试时也曾在这些陷阱题上吃过亏。今天我们就来深度剖析这些高频错题背后的原理帮你建立正确的知识框架。1. CSS3伪类选择器你以为的简单题可能藏着坑很多同学觉得CSS选择器是基础中的基础笔试时看到这类题目往往会掉以轻心。但大厂笔试题最擅长的就是把简单知识点设计成看起来简单实际暗藏玄机的题目。让我们看这道经典错题下面CSS3新增伪类中不正确的一个是A. p:first-of-typeB. p:only-of-childC. p:nth-child(2)D. :disabled正确答案是B因为CSS3中根本没有only-of-child这个伪类。但为什么这么多人会选错我们来分析常见误区1.1 only-child vs only-of-type一字之差天壤之别这两个伪类特别容易混淆伪类选择器匹配条件示例说明:only-child元素是其父元素的唯一子元素divp/p/div中的p元素:only-of-type元素是其父元素中同类型的唯一元素divp/pspan/span/div中的p元素关键区别:only-child要求绝对唯一不能有任何兄弟节点:only-of-type只要求同类唯一可以有其他类型的兄弟节点1.2 高频变式题预测面试官可能会这样变式考察div p第一个段落/p spanspan元素/span p第二个段落/p /div问如何选择唯一的span元素答案应该是span:only-of-type而不是span:only-child。2. Vue组件通信props的单向数据流陷阱另一道高频错题涉及Vue组件通信关于Vue组件间通信说法错误的是 A. Vuex可以实现任何关系的组件间的通信B. 如果子组件修改通过props获取的父组件传过去的字符串或数字会报错C. 子组件可以通过$emit给父组件传值D. 可以通过context进行组件间传值正确答案是D因为context是React的APIVue中并不存在。但更值得关注的是B选项的深层原理。2.1 props修改报错的真相很多同学知道props不能直接修改这个规则但不清楚背后的机制// 父组件 template child-component :messageparentMsg / /template // 子组件 props: [message], methods: { updateMessage() { this.message 修改props // 控制台会警告 } }原理剖析Vue使用Object.defineProperty将props设置为只读属性基本类型字符串、数字等修改会直接报错对象/数组等引用类型修改属性不会报错但违反单向数据流原则提示正确的做法是使用$emit通知父组件修改或在子组件中使用局部变量拷贝props值2.2 Vue通信方案适用场景对比通信方式适用场景优点缺点props父→子通信简单直接层级深时繁琐$emit子→父通信事件驱动需要父组件监听Vuex复杂组件关系/跨级通信集中管理小型项目可能过度设计事件总线非父子关系组件灵活难以追踪维护provide/inject祖先→后代组件通信跨层级响应式处理需要额外工作3. this指向箭头函数与传统函数的差异这道关于this指向的题目错误率也很高var p1 { name: 小明, age: 12, action: function(where, doing) { console.log(this.age 岁的 this.name 在 where doing); } } var p2 { name: 小红, age: 15 } console.log(p1.action.call(p2, 操场上, 运动))正确答案是D但很多同学不理解call和箭头函数的区别。3.1 函数this指向的四种规则默认绑定独立函数调用时this指向全局对象严格模式下为undefinedfunction foo() { console.log(this) } foo() // window或global隐式绑定作为对象方法调用时指向该对象obj.foo() // this指向obj显式绑定通过call/apply/bind强制指定thisfoo.call(obj) // this强制指向objnew绑定构造函数中this指向新创建的对象new Foo() // this指向新实例3.2 箭头函数的特殊之处箭头函数没有自己的this它的this继承自外层函数作用域。这就是为什么在事件监听器中function test() { this.flag false; this.change () { this.flag true; console.log(button.flag); }; } const button new test(); document.addEventListener(click, button.change);点击后会输出true因为箭头函数的this始终指向button实例而不是触发事件的DOM元素。4. 前端算法基础广度优先搜索的实现虽然前端对算法要求相对较低但大厂笔试中常会考察基础算法实现在图的广度优先搜索遍历算法中使用的辅助数据结构是正确答案是队列这与深度优先搜索使用栈形成鲜明对比。4.1 BFS与DFS对比实现// 广度优先搜索队列实现 function BFS(node) { const queue [node] while (queue.length) { const current queue.shift() console.log(current.value) current.children.forEach(child queue.push(child)) } } // 深度优先搜索栈实现 function DFS(node) { const stack [node] while (stack.length) { const current stack.pop() console.log(current.value) // 注意子节点要逆序入栈 [...current.children].reverse().forEach(child stack.push(child)) } }关键区别BFS按层级遍历适合最短路径问题DFS沿着分支深入适合存在性判断5. eval的性能陷阱与替代方案最后一道关于eval的题目虽然简单但背后的知识点很重要eval的功能就是将一串字符串转化为JS代码并执行返回一个或多个值如果eval中的参数不是字符串那么函数返回的就是这个参数而且整个过程非常消耗性能不推荐使用5.1 为什么不推荐使用eval安全风险可能执行恶意代码eval(userInput) // 极度危险性能问题无法被JavaScript引擎优化需要启动解释器无法应用JIT编译优化调试困难错误堆栈信息不清晰5.2 安全替代方案场景替代方案示例JSON解析JSON.parse()JSON.parse({a:1})动态属性访问方括号表示法obj[propName]动态函数生成Function构造函数new Function(a, return a*2)在实际项目中我曾遇到一个案例开发者使用eval解析后端返回的JSONP数据结果因为后端被XSS攻击导致前端执行了恶意脚本。改用JSON.parse后不仅性能提升30%还彻底消除了安全隐患。

更多文章