百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

写给准备跳槽的Web前端工程师(第二章)

toyiye 2024-06-21 11:58 12 浏览 0 评论

前言

全系列分为四个章节,分别是电话面试部分、一面部分、二面部分、三面部分。全系列不光有题目还有详细答案,收藏转发就完事了!

第一章:电话面试部分已经放出:万字长文系列:Web前端百度面经(含答案)第一章

希望这个系列能够助力大家,今年一帆风顺!!

接下来,长文预警~大家有所心理准备

正文:一面


自我介绍以及之前工作流程和模式

这里面试官估计想了解以前的工作状态,是否是一个公认的合理的开发和工作模式,从实习到百度,经历告诉我,不同量级不同类型的公司在这方面差别很大,同时也能反映出之前的公司技术水平和能力,从而面试官判断对面的人是否能够和自己愉快的进行合作开发。

也可能是我想多了,就是简单问问,减轻点被面试者的压力

一个基本的语义化布局的页面你想怎么规划

这个问题说实话没明白想问啥,难不成只是想问语义化?这么简单?

  • 主体框架(简单的瀑布流布局)
<nav></nav>
	<header></header>
	<main>
		<section></section>
		<section></section>
	</main>
<footer></footer>

CSS上有没有什么书写注意点或者可优化的角度

说了这个问题我明白了,这是让我说一说在基础层面的页面优化方向,只不过把大问题分化成细节了

这里不说很细了,之前专门写过这方面优化的文章,详细内容可以点击下方链接去阅读

Web前端性能优化:JavaScript细节篇

  • 能用html/css解决的问题就不要用js 比如hover显示隐藏 比如导航高亮 自定义原始样式 巧用伪类解决问题 使用预编译器
  • 不滥用高消耗的样式
  • 选择器合并
  • 0值去单位,小于1的值去掉0

使用Float进行布局容易产生什么问题?解决方式呢?

  • 子元素在设置 float 后会脱离文档流,造成父元素高度塌陷
  • 解决方式: 父元素设置高度 清除浮动
// test.html
<div class="outter">
	<div class="inner"></div>
	<div style="clear: both;"></div>
</div>

// test.css
.outter { width:200px; background:#3FF; border:1px solid #000;}
.inner { float:left; width:120px; height:80px; background:#FF3; }

简单说几种垂直水平居中的方式

  • 固定宽高
// test.html
 <div class="outer">
	<div class="inner">
		inner-box
	</div>
</div>

// test.css
.outer {
	width: 500px;
	height: 300px;
}
.inner {
    width: 100px;
    height: 100px;
    background-color: red;
    color: #fff;
}

// 1. position absolute + 负margin
.outer {
	position: relative;
}
.inner {
	position: absolute;
	top: 50%;
	left: 50%;
	margin-top: -50px; // 子元素高度一半
	margin-left: -50px; // 子元素宽度一半
}

// 2. position absolute + calc
.outer {
	position: relative;
}
.inner {
	position: absolute;
	top: calc(50% - 50px);
	left: calc(50% - 50px);
}

// 3. position absolute + margin auto
.outer {
	position: relative;
}
.inner {
	position: absolute;
	top: 0;
	left: 0;
	right: 0;
	bottom: 0;
	margin: auto;
}
  • 不固定宽高
// test.html
 <div class="outer">
	<div class="inner">
		inner-box
	</div>
</div>

// test.css
// 1. flex布局
.outer {
  display: flex;
  justify-content: center;
  align-items: center;
}

// 2. position absolute + transform
.container {
	position: relative;
}
.box-center {
	position: absolute;
	top: 50%;
	left: 50%;
	transform: translate(-50%, -50%);
}
// 3. css-table
.outer {
	display: table-cell;
	text-align: center;
	vertical-align: middle;
}
.inner {
	display: inline-block;
}

// 4. grid布局
.outer {
	display: grid;
	justify-items: center;
	align-items: center;
}
.inner {
	text-align: center;
}

盒子模型

  • box-sizing: content-box(W3C盒子模型):元素的宽高大小表现为内容的大小。
  • box-sizing: border-box(IE盒子模型):元素的宽高表现为内容 + 内边距 + 边框的大小。背景会延伸到边框的外沿。

什么情况下回发生回流和重绘

  • 回流 页面一开始渲染 显示隐藏元素 浏览器窗口变化 元素位置变化 元素尺寸变化
  • 重绘 样式改变不影响元素的位置时,比如 color、background,当然还有visiability

追问:回流和重绘的关系是什么样的

  • 重绘不一定会发生回流
  • 回流一定触发重绘

追问:怎么避免回流产生

  • 避免多级嵌套
  • 避免使用内联样式
  • 避免使用计算样式
  • 尽量少的使用JS去操作DOM结构
  • 使用CSS3属性以被动启动GPU加速

事件委托

  • 详细的原理要从DOM的事件机制说起:捕获事件阶段、冒泡事件阶段、目标时间阶段
  • 事件委托是利用冒泡机制来实现的,可以减少内存消耗,减少注册事件。

平常开发遇到涉及数组遍历或对象遍历问题都是用什么方式

这里说的可能不是很全,记得之前阅读过一篇全面分析各种循环方式的文章,找到后再为大家总结一遍,敬请关注。

  • 对象循环 for...in 遍历 Object.keys(Object),创建包含对象属性的数组 Object.values(Object),创建包含对象值的数组 Object.getOwnPropertyNames(Object),返回一个数组,包含对象自身的所有属性(包含不可枚举属性) Object.entries(Object),创建了一个二维数组,每个内部数组都有两个元素,第一个元素是属性名,第二个属性值
  • 数组循环 基本的 for forEach map for...of 使用ES6 filter(),some(), every()进行业务查找和筛选

追问:map和forEach的共同点和区别

  • 共同点 都是遍历数组 都支持三个参数,item(当前每一项),index(索引值),arr(原数组)
  • 区别 map()会分配内存空间存储新数组并返回, forEach()不会返回数据 forEach()允许callback更改原始数组的元素, map()返回新的数组

追问:普通for循环和forEach的区别

这里一开始没明白面试官想要问啥,答了forEach更加简洁一些,普通for循环针对大量级数据性能更好,然后面试官直接说在跳出循环上说一下,才明白要问的,这里提醒大家,如果没弄明白想问啥,一定要问清楚

  • for 循环可以通过 break,continue, return 跳出循环
  • forEach 不能使用上述跳出方式,可以采用 try...catch 的写法,扔出一个 Error 跳出循环

追问:刚才说到 for...in 循环对象,有没有碰到什么疑惑或者问题,怎么解决的

  • 遍历的是原型链中的数据,需要使用 hasOwnProperty 看是否属于该对象。

追问:既然说到原型了,讲讲你理解的原型和原型链吧

从循环的问题追问到原型,我可太南了

简单讲

  • 每一个函数都有一个prototype对象属性,指向另一个对象(原型链上面的)
  • prototype就是调用构造函数所创建的那个实例对象的原型(proto)
  • 实例对象与原型之间的连接,叫做原型链

展开讲

在展开讲的时候,我边画图边给面试官讲的,作为技术人员嘛,充分利用各种形式展现自己的技术理解,大概就是下边这张图


  • 定义了一个函数后,天生自带 prototype 指向函数的原型对象
  • 函数经过new调用后,返回一个全新的实例对象,实例对象的 _proto_ 指向构造函数的原型对象
  • 对象的 hasownproperty() 来检查自身中是否含有该属性

事件机制

  • 浏览器的JS引擎管理着事件代码的调用和执行,主线程在运行时会产生执行栈,栈中的代码调用某些异步API时会在任务队列中添加事件,栈中的代码执行完毕后,就会读取任务队列中的事件,去执行事件对应的回调函数,如此循环往复,形成事件循环机制。
  • 整体的执行顺序:宏任务 -> 微任务 -> 必要的渲染UI -> 下一轮Eventloop
  • 通俗点的流程 执行一个宏任务(首次执行的主代码块或者任务队列中的回调函数) 执行过程中如果遇到微任务,就将它添加到微任务的任务队列中 宏任务执行完毕后,立即执行当前微任务队列中的所有任务(依次执行) JS引擎线程挂起,GUI线程执行渲染 GUI线程渲染完毕后挂起,JS引擎线程执行任务队列中的下一个宏任务
  • 宏任务: script主代码、setTimout、setInterval、事件I/O等
  • 微任务:promise等

追问笔试题:那道经典的setTimeout题,并问什么会这样输出

  • 主线程执行同步任务,也就是主循环,setTimeout 为宏任务,同时是异步任务,会被挂起到循环结束
  • 循环结束执行 setTimeout 的回调,执行时发现 i 的当前作用域不存在,向上查找,在全局作用域中发现了 i ,此时循环已经结束,所以全都输出同一个数

追问笔试题:一道结合了各种 setTimout 和 promise 的事件机制输出题目,共有十一个输出代码块

题目具体已经不记得了,反正记住执行顺序一点一点的输出,面试时最好带个笔记本或者电脑,可以随时记录下,方便回答

HTTP请求的三次握手机制

三次握手机制这里不再大篇幅展开讲了,随便搜索就能找到一堆详解

追问:HTTP请求为什么是三次握手,不是两次或者四次

  • 三次握手是确定客户端和服务端接收和发送能力都正常的最优次数 第一次:客户端发送能力正常 第二次:服务端接收能力正常,服务端发送能力正常 第三次:客户端接收能力正常

追问:HTTP、HTTPS的区别

  • HTTPS更安全:http 是超文本传输协议,信息是明文传输,https 则是具有安全性的 ssl 加密传输协议
  • HTTP更简单:http 的连接是无状态的;HTTPS 协议是由 SSL+HTTP 协议构建的可进行加密传输、身份认证的网络协议。

追问:关于缓存方面讲一讲

这个问题之前写过关于缓存策略的文章,不在展开讲,详细内容请点击作为程序员,HTTP缓存这一块还是需要了解一下的

  • 强缓存(不走服务器): Expires Cache-Control
  • 协商缓存(走服务器): Last-Modified/If-Modified-Since ETag/If-None-Match

追问:几种缓存策略的对比简单说一下

这个问题也在关于缓存策略的文章里,上述那个文章

前端跨域问题如何产生,有什么方法解决

这里之前写过详细的文章,不展开细讲了,可以点击这里查看Web前端开发,必须要了解的四种跨域解决方案

  • 产生原因:同源策略
  • 解决方式: jsonp实现跨域请求 使用 iframe + form 进行跨域请求 CORS(跨域资源共享 Cross-origin resource sharing)进行跨域请求 利用服务器中转

追问:JSONP跨域有什么特点

  • 只支持 GET 请求

追问:CORS进行跨域有什么特点

这个追问题我回答完之后面试官说是临时想出来的,但是他没想到我之前看过相关的文章还整理出来了,这不是巧了么这不是~ 这个问题的答案也在上面给出的前端跨域文章里

  • CORS请求分为简单请求和非简单请求,区分方式是看请求头和请求方法 (只有 GET、POST、HEAD)
  • 简单请求:服务端配置好的前提下,简单请求直接请求就可以
  • 非简单请求:在请求时会发送两次请求,第一次是预检测请求,返回的状态码为204,第二次请求为预检测请求通过后才会发送真实请求

问到这里其实一面已经结束了,不过面试官看来需求不多,告诉我一面已经过了,看我是Vue技术栈,遂通过Vue又续上了,没有问很深入的问题,都是小细节,当做聊家常了,然后我猜测二面应该会问关于Vue深层次的问题,不过我还是有点信心的,毕竟是看过源码的人。

就在我写这篇文章的收尾阶段,网上发布了关于尤雨溪和Vue的纪录片,链接附上纪录Vue.js尤雨溪 - 中英CC字幕 - Honeypot呈现,朋友们可以当做茶余饭后的小片看,这里建议大家,少看那些场景简单,人物两三个人,说着奇奇怪怪语言的视频!

有没有遇到深层次对象双向绑定后子组件未监听到更新的情况,怎么解决的

  • 解决方式: 一:深层监听 deep: true,但是这样会带来性能问题 二:使用 this.$set() 进行赋值

Vue的data以Function方式返回的原因

  • 避免产生变量共享,不以返回值的情况下,所有组件将共享同一个对象,指向相同的内存地址

Vue的响应式怎么做的,简单说

  • init 时利用 Object.defineproperty 监听数据变化
  • 利用 setter 和 getter 进行触发

尾声

这里一面算是正式结束了,面试官走的时候说回答的不错,我去给你找个精通 Vue 的二面来,你们再聊聊。

一面面试官说完我瞬间感觉要爆炸,我可太南了!但是事实是二面面试官并没有很深入的问,而是让我自己说,他从中问一些细节。后来才知道,百度有个业务组的领导是Vue的核心开发者,大家都很熟悉Vue。

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码