30 个 Web 开发人员面试问题(附答案)
概述
概述
我不知道你是怎么想的,但我不喜欢技术面试。即便如此,技术面试确实可以有效地发现新的改进领域。
每次面试后,我的例行工作是研究那些我没有信心回答的问题,并写一个简短的总结。
以下是一些面试问题以及我在网上看到的一些其他问题。
快速链接:
经验水平
我有大约 1 年的几乎每天的编码经验(训练营 + 自由职业),并且作为网页设计师还获得了一些额外的网络知识。
为什么要写另一份“面试问题”清单?
-
通过重写这些概念来帮助自己进一步灌输这些概念。
-
帮助处于类似水平的其他人了解预期结果。
我仍然鼓励你研究自己的答案,这就是为什么每个部分都有方便的研究链接供你深入研究。😁
欢迎在下方留言,分享你对这些问题的不同看法。我非常期待从这个优秀的开发者社区学习更多最佳实践。💪
问题
HTML部分
5. 在 HTML 中使用该<script>
标签有哪些不同的方法?
CSS 部分
10. 如何使用 BEM 命名约定在 SCSS 中重写此 CSS 代码?
display
11.您知道该房产的哪些价值以及它们有何独特之处?
JavaScript 部分
13. 解释 For、While 和 Do...While 循环之间的区别。
React 部分
19. 如果一个组件获得 props 并重新渲染,其他组件也会再次渲染吗?
后端部分
MISC 开发科
HTML部分
1. 为什么alt
文本很重要?
<img src="libary.jpg" alt="Young woman in the library sitting by a table of books."/>
它们为图像提供浏览器和屏幕阅读器都可以看到描述。
这一点很重要,因为与文本不同,图像无法提供太多关于其内容的背景信息。所以这对SEO和可访问性都非常有帮助。
当图像中断时,浏览器也会显示此 alt 标签,这有助于改善用户体验。
2.HTML中的标签起什么作用<DOCTYPE>
?
<!DOCTYPE html>
<html lang="en">
<head>
...
这是我们在 HTML 文件最顶部指定的标签,目的是让浏览器知道我们正在使用的 HTML 版本。这有助于浏览器理解文件中的语法。
3. 使用适当的语义元素优化此 HTML 代码。
<!-- Orginal Code -->
<div>
<div>
<div>This is a blog Title</div>
<div>This is the main blogs body text...</div>
<img src="cars.jpg" />
<div>Image caption</div>
<div>This is a blog subtitle</div>
<div>More body text...</div>
</div>
<div>
<div>Categories</div>
<div>
<a href="#">Category 1</a>
<a href="#">Category 2</a>
<a href="#">Category 3</a>
</div>
</div>
</div>
<!-- Refactored Code -->
<section>
<article>
<h1>This is a blog Title</h1>
<p>This is the main blogs body text...</p>
<figure>
<img src="cars.jpg" alt="3 cars driving down a hilly road."/>
<figcaption>Image caption</figcaption>
</figure>
<h2>This is a blog subtitle</h2>
<p>More body text...</p>
</article>
<aside>
<h3>Categories</h3>
<ul>
<li><a href="#">Category 1</a></li>
<li><a href="#">Category 2</a></li>
<li><a href="#">Category 3</a></li>
</ul>
</aside>
</section>
变化
-
<section>
由于博客内容是一起的,因此使用标签来包装所有博客内容。 -
标签
<article>
用于标示博客的主要内容。<h1>
由于标题需要最重要的语义价值,因此赋予了它一个标签。<h2>
在副标题中使用了“An” ,因为它很重要,但不如标题重要。<p>
使用标签来包装所有常规文章副本。<alt>
已向图像添加属性以增强可访问性和 SEO 优势。- 并且用于将图像和标题关联在一起
<figure>
。<figcaption>
-
用来
<aside>
包装类别元素,因为它仅间接地与主要博客内容相关。<h3>
使用An作为类别标题,因为它在所有标题中具有最小的语义影响。<ul>
并<li>
使用标签来包装类别链接以提高可访问性。
4.什么是 Open Graph 元标签?
<head>
<!-- Primary Meta Tags -->
<title>trust4leaders</title>
<meta name="title" content="trust4leaders">
<meta name="description" content="We are on a mission to improve outcomes by developing trust between people.">
<!-- Open Graph / Facebook -->
<meta property="og:type" content="website">
<meta property="og:url" content="changeforleaders.com">
<meta property="og:title" content="trust4leaders">
<meta property="og:description" content="We are on a mission to improve outcomes by developing trust between people.">
<meta property="og:image" content="/assets/img/og-image.jpg">
<!-- Twitter -->
<meta property="twitter:url" content="changeforleaders.com">
<meta property="twitter:title" content="trust4leaders">
<meta property="twitter:description" content="We are on a mission to improve outcomes by developing trust between people.">
<meta property="twitter:image" content="/assets/img/og-image.jpg">
<meta property="twitter:card" content="summary_large_image">
</head>
这些是特殊的元标记,可用于 HTML 中,<head>
在社交媒体网站上以富媒体卡片的形式显示信息。信息可以包括图片、标题、描述、URL 和类型。
Facebook 建立了 Open Graph (OG) 元标签,大多数平台都在使用它们。然而,值得注意的是,Twitter 提供了自己的语法。(如上所示。)
许多平台还提供“调试器”,它将抓取这些标签的 URL 并预览帖子的外观。
5. 在 HTML 中使用该<script>
标签有哪些不同的方法?
包装
<body>
...
<script>let Alert = ReactBootstrap.Alert;</script>
</body>
将客户端脚本语言(例如 JS)包裹在<script></script>
标签中即可运行代码。代码放置在正文的底部,以免阻塞 DOM 渲染。
输入
<body>
...
<script src="./index.js"></script>
</body>
可以通过在 script 标签中添加属性来导入外部脚本src
。这是首选方法,因为它可以让你清晰地模块化代码,而无需将其绑定到单个 HTML 文件。
推迟导入
<head>
...
<!-- Will run after DOM loads -->
<script defer src="./script1.js"></script>
<!-- Will run after DOM and script1.js loads -->
<script defer src="./script2.js"></script>
</head>
<body>
...
</body>
该defer
属性将停止脚本运行,直到 HTML 文件 (DOM) 上的所有内容都渲染完毕。但是,它仍会与 DOM 并行从服务器下载,然后按同步顺序运行。
这对于性能确实很有帮助,也意味着脚本将能够充分访问它需要附加处理程序的任何 HTML 元素。
异步导入
<head>
...
<!-- Will run second since it downloads slower -->
<script async src="./longScript.js"></script>
<!-- Will run first since since it downloads faster -->
<script async src="./shortScript.js"></script>
</head>
<body>
...
</body>
该async
属性将与页面同时加载并运行脚本。它还会在任何其他脚本加载完成之前异步运行其脚本。这对于我们网站不依赖的第三方功能非常有用。(例如 Google Analytics。)
CSS 部分
6.您对 Bootstrap 的使用感觉如何?
我对这个框架非常满意。我已经通过 CDN 链接在多个网站上使用了它,也曾在本地托管源文件并使用 SASS 进行主题设置。
在一些 React 项目中,我也使用了该框架的 react-bootstrap 版本。
最近,我更加专注于使用“原生”CSS 工具,例如 Flexbox 和 CSS Grids。这让我能够更好地理解框架的内部工作原理,并且不会过度依赖它。
7. 如何覆盖 Bootstrap 按钮样式?
CSS 覆盖
.btn {
border-radius: .75rem;
}
.btn-primary {
background-color: #1f48bb;
}
#heroBanner .btn-primary {
background-color: #1f48bb;
}
只要我的 CSS 文件位于引导 CDN 链接下方,我就可以像使用我自己的 CSS.btn
一样定位它的类和变体。.btn-primary
在某些情况下,可能会存在特异性问题,然后我会将其他选择器(如 ID)串起来以增加特异性。
SCSS 覆盖
$btn-border-radius: 10rem;
.btn {
box-shadow: 0px 4px 4px 0px rgba(0,0,0,0.15);
font-weight: 700;
&:hover {
box-shadow: inset 0px 0px 10px 2px rgba(0, 0, 0, 0.15);
background: $brandGradient1;
}
}
我最好直接针对 Bootstrap 样式和 SASS 变量。
这里我不会修改原始框架文件,因为 Bootstrap 更新后我的更改可能会被覆盖。我还是会为按钮覆盖创建一个单独的 SCSS 文件,并将新的样式放在那里。
8. 该属性是什么box-sizing
?
通过确定 CSS 盒模型的哪些部分包含在整体尺寸中,这将影响元素的大小。
/* Size: 100x100px */
.box1 {
display: border-box;
width: 100px;
height: 100px;
padding: 20px;
border: 1px solid black;
}
/* Size: 142x142px */
.box2 {
display: content-box;
width: 100px;
height: 100px;
padding: 20px;
border: 1px solid black;
}
-
该
border-box
值包括整体尺寸中的边框、内容和填充尺寸。 -
该
content-box
值仅包含内容的大小。如果存在边框或填充,则其附加尺寸将添加到整体尺寸中。
9. 您如何有效且高效地使用 CSS 动画?
-
CSS 动画的执行方式不应造成不必要的页面重绘。例如,通过调整 向下推动某个项目
margin-top
会将其下方的所有其他项目向下推动,从而导致页面的相应部分重绘。相反,transform: translateY()
会更高效。 -
另一件需要避免的事情是将
filter: blur()
(或任何滤镜属性)绑定到较长的滚动动画上。我曾经尝试在滚动时模糊掉一个英雄图像,结果拖慢了整个页面的加载速度,尤其是在 Safari 上。 -
使用时间变化和相反方向的动画可以增添趣味。您可以调整三次贝塞尔曲线,让元素以不同的速度开始和结束。同时让一个元素微妙地向下移动,另一个元素则向上移动,可以营造出一种美妙的张力。
10. 如何使用 BEM 命名约定在 SCSS 中重写此 CSS 代码?
/* Orginal Code */
.button {
height: 40px;
max-width: 200px;
font-size: 20px;
}
.button-with-icon {
color: black;
background-color: white;
border: 1px solid black;
display: flex;
justify-content: space-between;
}
.primary-button {
color: white;
background-color: green;
}
.danger-button {
color: white;
background-color: red;
}
.button:hover,
.primary-button:hover,
.primary-button-with-icon:hover {
background-color: blue;
}
.big-danger-button:hover {
opacity: 0.5;
}
/* Refactored Code */
.button {
height: 40px;
max-width: 200px;
font-size: 20px;
&__icon {
color: black;
background-color: white;
border: 1px solid black;
display: flex;
justify-content: space-between;
}
&--primary {
color: white;
background-color: green;
}
&:hover {
background-color: blue;
}
&--danger {
color: white;
background-color: red;
&:hover {
opacity: 0.5;
}
}
}
此解决方案采用了 BEM 方法,将块、元素和修饰符拆分成各自的类,同时保持其上下文关系。借助 SASS 的嵌套功能,我还减少了所需的代码量。
display
11.您知道该房产的哪些价值以及它们有何独特之处?
.box {
display: inline;
display: block;
display: inline-block;
display: flex;
display: grid;
display: none;
}
-
该
inline
值将使元素占据其内容的宽度并位于其他元素旁边inline
。inline-block
标签<span>
默认inline
为。 -
该
block
值会占据所有可用宽度,将其他元素推至下一行。其他元素的高度/宽度可以调整,且margin-top/bottom
会得到保留。默认情况下,<div>
标签会block
保留。 -
该
inline-block
值具有值的所有特征block
,除了它们不会将其他元素推到下一行。<button>
标签是inline-block
默认的。 -
该
flex
值启用了一组强大的 CSS 属性,这些属性会影响父元素及其子元素的布局、对齐和顺序。 -
该
grid
值与非常相似,但flex
在语法和功能上有一些变化。例如,它还可以让你指定网格中元素之间的间隙大小。 -
该
none
值将完全隐藏其所分配的元素。
JavaScript 部分
12.什么是事件委托?
当处理交互元素(如按钮)时,我们通常会将一个唯一的事件监听器附加到元素上,以便在触发时执行一些代码。
但是,如果我们有一大组按钮或一个包含数百个可点击单元格的表格,这可能会导致严重的性能问题。
事件委托允许我们通过仅分配一个事件监听器来处理所有点击来显著优化这个问题。
我们可以为我们想要点击的元素组的父元素/容器分配一个事件监听器。(例如,一个包含多个按钮的 div。)
document.getElementById('parent')
.addEventListener('click', event => {
if (event.target.className === 'buttons') {
// Code executed here
}
});
为了实现这一点,我们使用了一种称为事件传播的过程,其中任何被定位(点击)的项目都会将事件发送回 DOM 中的根元素。这被称为“冒泡”或“从目标向上冒泡”,然后父元素可以监听该事件。
ROOT | Window ^
| Document | Event
| <html> | Bubbling
| <body> | Back Up
| <div> |
TARGET v <button> |
13. 解释 For、While 和 Do...While 循环之间的区别。
For 循环
此循环会循环执行一段代码,直到满足指定的数字条件。我们可以为其设置起始变量、条件或终点,以及每次循环应增加的量。
for(let i = 1; i <= 5; i++) {
console.log(`This ran ${i} times!`);
}
While 循环
此循环会循环执行一段代码,直到其检查的条件返回 false。当没有设置特定金额来设置条件时,此方法很适合。
let cats = 5;
while(cats <= 0) {
console.log(`There are still ${cats} here!`);
cats--;
}
Do...While 循环
这个循环会执行一段代码,然后检查一个条件。它会一直执行代码并进行检查(按此顺序),直到条件为假。
let cats = 5;
do {
console.log(`There are still ${cats} here!`);
cats--;
} while(cats <= 0)
14. 如何在 Node.js 中将数据解析为 JSON?
我会用该JSON.parse()
方法获取一个 JSON 字符串并将其转换为对象或数组。然后,我可以用它将JSON.stringify()
数组或对象重新转换为字符串。
const json = '{"result":true, "count":42}';
// Parsing
const object = JSON.parse(json);
console.log(object.count); // expected output: 42
// Stringify
const string = JSON.stringify(object);
console.log(string); // expected output: '{"result":true, "count":42}'
var
15. 解释、let
和之间的区别const
。
-
var
是一种不遵守块作用域的遗留变量类型。 -
let
和const
都是遵循块级作用域的 ES6 变量。Let 变量允许你稍后更新,而const
不允许。 -
函数通常被设置为,
const
因为它们不会停止作为函数。而循环可能会使用 来let
赋值和更新变化的信息。
this
16.与常规函数相比,箭头函数的行为有何不同?
箭头函数将this
上下文保留到外部函数。
如果我们使用常规函数进行回调,this
则使用其中的回调函数。
const myObject = {
myMethod(items) {
console.log(this); // logs myObject
const callback = () => {
console.log(this); // still logs myObject
};
}
};
反应
17. 如果在 React 中直接更改状态会发生什么?
这可能会导致错误。useState
并且setState
并不总是立即更新状态。相反,它们会创建一个称为“待处理状态转换”的东西,并将状态更改放入队列中。
因此,如果您在 React 有机会从队列中执行此操作之前直接改变状态,则它很可能会被覆盖。
状态应该始终被视为“不可变的”。
18. 如何向 React 中的子组件发送信息?
在子组件上使用 props 允许你从父组件发送数据。子组件通常会设置结构,以便通过 props 从父级组件接收数据输入。
但是,信息无法通过 props 发送回父组件。
19. 如果一个组件获得 props 并重新渲染,其他组件也会再次渲染吗?
该组件的任何接收 props 的子组件也将重新渲染。我们可以使用多种方法来阻止重新渲染……
-
生命周期方法
shouldComponentUpdate()
允许我们使用nextState
&nextProps
来比较是否有任何变化。如果返回 false,则不会进行渲染。 -
基于类的组件也可以使用 PureComponent 仅在先前的 props 和状态不同时进行渲染。
-
useMemo
如果功能组件中的 props/state 没有改变,该钩子还可以让我们防止重新渲染。
20. 如何在组件之间共享状态?
-
您可以利用
useContext
钩子并通过提供程序使状态可供特定组件使用。 -
状态可以通过 props 传递,但如果我们向下移动多个级别,这可能会变得复杂。
-
状态可以通过调度动作有效负载存储在 React Redux 存储中。然后其他组件可以通过该
mapStateToProps
函数来使用此状态。
21.如何调试 React-Redux 应用程序中的问题?
我将使用 Chrome Redux Dev Tools 扩展来可视化状态未正确触发的位置。
一旦缩小流程中存在的错误,我就会检查 reducer、store 和 action creators 是否存在错误。
如果它们看起来没问题,我就会查看正在调度和访问商店的组件。
后端部分
22. Mongoose 的用途是什么?
Mongoose 是一个 ODM,为 MongoDB 提供模式验证和结构化数据。由于 MongoDB 本身并不提供丰富的结构化数据,因此 Mongoose 负责管理数据的关系。
23.解释 RESTful 路由。
在这里我们可以使用 HTTP 动词(GET、POST、PUT 和 DELETE)并将它们映射到服务器端 CRUD 操作。
通过为不同的操作设置单独的路由,我们可以建立逻辑端口来执行某些操作。
例如,从 GET 路由接收所有用户的数组,与使用 DELETE 路由删除特定用户。
// FRONT-END
axios.get('/users')
.then(response => {
// do something
})
.catch(err => {
// do something
})
axios.delete(`/user/${userId}`)
.then(response => {
// do something
})
.catch(err => {
// do something
})
// BACKEND
router
.route("/user/:id")
// gets a user by id
.get(userController.findById)
//delete user
.delete(userController.remove);
24. 解释中间件以及如何在应用程序中使用它。
中间件就像请求者和服务之间的守门人。
它拦截请求,对其进行某种检查,然后将其传递到下一个点或拒绝它。
例子
假设客户端请求访问某个页面。我们可以使用像 Passport 这样的身份验证中间件来验证该请求,以确定用户是否已登录。
如果不是,他们可能会被重定向到登录屏幕。如果他们通过了身份验证,那么 Passport 中间件将允许请求通过服务器。
25.什么是 HTTP 服务器响应状态代码?
这些是服务器发送给客户端的有关请求状态的数字代码。
例如,200 状态码表示请求已成功接收。而 404 状态码则表示未找到页面。
有很多请求,有些很有帮助,有些则很愚蠢。(418 的意思是“我是一把茶壶”)。🫖
MISC 开发科
26.什么是延迟加载?
延迟加载是延迟内容和数据加载到页面直到满足特定参数的过程。
它与 Intersection Observer API 结合使用,用于判断内容何时与视口的不同部分相交。此时,前端开始发出加载数据的请求。
这有助于节省带宽成本、加载时间和数据下载成本。因为只有正在查看的内容才会从服务器下载。
27.你如何改善SEO?
-
在图像上使用
alt
文本 -
title
向页面添加元标记 -
向页面添加元描述
-
确保字体大小可读(大多数正文为 16-18px,不小于 12px)
-
点击区域对于移动设备来说足够大(35-45px 高度是一个很好的目标区域)
-
拥有优质独特的内容,提升价值。(单纯的转发和联盟链接可能会造成损害)
-
使用本地语言撰写文案。(英国和美国的网站应注意常用词的拼写:color 和 colour)
-
为链接提供描述性措辞(“阅读 SEO 报告”与“点击此处”)
-
使用良好的语义 HTML 结构,而不是将所有内容都放在
div
. -
确保所有相关页面均未被阻止编入索引
-
向 Google Search Console 提交站点地图
-
在文章中添加视频嵌入,鼓励用户停留在页面上。更长的页面停留时间可以提高排名。
28. 您熟悉哪种测试框架?
我在训练营中使用过一些 Jest,以及用于 React 的 Enzyme。我还学习了单元测试、测试驱动开发和关注点分离等概念。
虽然我对这些框架还没有太多经验,但我渴望学习更多。
29. 如何提高网站的加载时间?
-
使用 Photoshop 和 tinyjpeg.com 正确压缩图像。(Jpeg 文件格式,72dpi,视网膜显示屏的双倍宽度/高度)
-
在 Node 应用程序上使用 Gzip 压缩通过网络发送的所有文件。
-
使用适当的脚本加载顺序,以便大型脚本尽可能不会加载过早。
-
对图像和折叠内容实施延迟加载
-
通过 CDN 提供文件,使服务器更靠近用户
-
减少使用的字体数量
-
压缩 CSS 和 JS
-
使用专用服务器而不是共享服务器来减少限制并提高带宽容量
-
如果网站是 WordPress,请减少使用的插件数量
30. 您将如何浏览代码库?
我首先会看看我的团队中是否有一位导师,他可以帮助我了解影响我任务的重要领域,以及我可以向谁发送问题。
然后我会评估这些领域正在使用哪些类型的技术。我还会询问在研究代码时是否有任何文档或指南需要注意。
如果出现问题,我会花大约15-20分钟进行调试,然后再寻求帮助。这样,我既能认真尝试解决问题,又不会浪费公司4个小时的时间来解决一个可能已经通过其他方式解决的问题。
其他问题参见:
使用Adobe Photoshop和Unsplash设计的标题图像
文章来源:https://dev.to/gedalyakrycer/30-web-developer-interview-questions-with-answers-3n3c