8 个终极全栈面试问题及答案
全栈 Web 开发人员是指能够同时处理应用程序前端和后端的人员。前端通常指应用程序中用户可见或交互的部分,而后端则指应用程序中处理逻辑、数据库交互、用户身份验证、服务器配置等的部分。
Q1:什么是控制反转?
主题:设计模式
难度:⭐⭐
控制反转是一个广义的术语,但对于软件开发人员来说,它通常被描述为用于解耦系统中的组件和层的模式。
例如,假设你的应用有一个文本编辑器组件,并且你想提供拼写检查功能。你的标准代码如下:
public class TextEditor {
private SpellChecker checker;
public TextEditor() {
this.checker = new SpellChecker();
}
}
我们这里的做法是在 TextEditor 和 SpellChecker 之间建立了依赖关系。在 IoC 场景下,我们应该这样做:
public class TextEditor {
private IocSpellChecker checker;
public TextEditor(IocSpellChecker checker) {
this.checker = checker;
}
}
通过将实例化拼写检查器的责任从 TextEditor 类移交给调用者,您已经反转了控制。
SpellChecker sc = new SpellChecker; // dependency
TextEditor textEditor = new TextEditor(sc);
🔗来源: stackoverflow.com
Q2:持续集成的成功因素是什么?
主题:DevOps
难度:⭐⭐
- 维护代码存储库
- 自动化构建
- 使构建自测试
- 每个人每天都致力于基线
- 每次提交(到基线)都应该构建
- 保持快速构建
- 在生产环境的克隆中进行测试
- 轻松获取最新交付成果
- 每个人都可以看到最新构建的结果
- 自动部署
🔗资料来源: edureka.co
Q3:什么是桥接模式?
主题:设计模式
难度:⭐⭐⭐
当我们需要将抽象与其实现解耦,以便两者可以独立变化时,可以使用桥接模式。这种设计模式属于结构模式,因为它通过在实现类和抽象类之间提供桥接结构来解耦它们。
当类本身及其功能经常变化时,桥接模式非常有用。类本身可以被视为抽象,而类的功能可以被视为实现。桥接模式也可以被视为两层抽象。
此模式涉及一个充当桥梁的接口,它使具体类的功能与接口实现类相互独立。两种类型的类可以在结构上进行修改,而不会相互影响。
桥接模式实现的示例如下:
----Shape---
/ \
Rectangle Circle
/ \ / \
BlueRectangle RedRectangle BlueCircle RedCircle
重构为:
----Shape--- Color
/ \ / \
Rectangle(Color) Circle(Color) Blue Red
或者一般来说:
A
/ \
Aa Ab
/ \ / \
Aa1 Aa2 Ab1 Ab2
重构为:
A N
/ \ / \
Aa(N) Ab(N) 1 2
🔗资料来源: tutorialspoint.com
Q4:解释一下 Docker 的用例
主题:DevOps
难度:⭐⭐⭐
- Docker 是一种在本地或云端运行虚拟机的低开销方式。虽然严格来说,它们并非独立的机器,也不需要启动操作系统,但它们却能带来许多好处。
- Docker 可以封装遗留应用程序,允许您将它们部署到使用旧软件包和软件版本可能不容易设置的服务器上。
- 在部署过程中,可以使用 Docker 构建测试盒,以促进持续集成测试。
- Docker 可用于在云中配置盒子,并且使用 Swarm 您还可以协调集群。
🔗来源: dev.to
Q5:解释 REST 和 GraphQL 之间的主要区别
主题:GraphQL
难度:⭐⭐⭐
REST 和 GraphQL 之间主要和最重要的区别在于GraphQL 不处理专用资源,而是将一切都视为图形,因此是相互连接的,并且可以根据应用程序的确切需求进行查询。
🔗资料来源: medium.com/codingthesmartway-com-blog
Q6:什么是事件循环?
主题:Node.js
难度:⭐⭐⭐
Node.js 是一个单线程应用程序,但它通过事件和回调的概念支持并发。由于 Node.js 的每个 API 都是异步的并且是单线程的,因此它使用异步函数调用来维持并发。Node 使用观察者模式。Node 线程保持一个事件循环,每当任何任务完成时,它都会触发相应的事件,从而通知事件监听器函数执行。
🔗资料来源: tutorialspoint.com
Q7:你能用简单的英语解释一下“git reset”的作用吗?
主题:Git
难度:⭐⭐⭐⭐
一般来说,git reset
功能是获取当前分支并将其重置为指向其他位置,并可能将索引和工作树带走。
- A - B - C (HEAD, master)
# after git reset B (--mixed by default)
- A - B (HEAD, master) # - C is still here (working tree didn't change state), but there's no branch pointing to it anymore
请记住,在 git 中你有:
- HEAD 指针,它告诉你正在处理哪个提交
- 工作树,代表系统上文件的状态
- 暂存区(也称为索引),用于暂存更改,以便稍后可以一起提交
因此考虑一下:
git reset --soft
移动 HEAD 但不触及暂存区或工作树。git reset --mixed
移动 HEAD 并更新暂存区,但不更新工作树。git reset --merge
移动 HEAD,重置暂存区,并尝试将工作树中的所有更改移动到新的工作树中。git reset --hard
移动 HEAD 并将暂存区和工作树调整到新的 HEAD,丢弃所有内容。
用例:
- 当你想移动到下一个提交并进行修补,但又不想“丢失当前位置”时使用
--soft
。这种情况很少见。 --mixed
当您想要查看另一次提交的情况,但又不想丢失任何已有的更改时,请使用(默认设置)。--merge
当您想要移动到新位置但将已有的更改合并到工作树中时使用。- 用来
--hard
清除所有内容并在新的提交中开始新的内容。
🔗来源: stackoverflow.com
Q8:解释 JavaScript 中的原型继承?
主题:JavaScript
难度:⭐⭐⭐⭐
在实现经典继承的语言(如 Java、C# 或 C++)中,您首先要创建一个类(对象的蓝图),然后您可以从该类创建新对象,或者您可以扩展该类,定义一个可以扩充原始类的新类。
在 JavaScript 中,首先创建一个对象(没有类的概念),然后可以扩充自己的对象或从中创建新的对象。
JavaScript 中的每个对象都有一个原型。JavaScript 的继承系统是基于原型的,而不是基于类的。当消息到达一个对象时,JavaScript 会首先尝试在该对象中查找属性,如果找不到,则将消息发送到该对象的原型,依此类推。这种行为称为原型链或原型继承。
构造函数是 JavaScript 中构建原型链最常用的方式。当我们使用 时new
,JavaScript 会以 关键字的形式向正在创建的新对象注入一个隐式引用this
。它还会在函数末尾隐式返回此引用。
function Foo() {
this.kind = ‘foo’
}
var foo = new Foo();
foo.kind //=> ‘foo’
🔗来源: sporto.github.io
文章来源:https://dev.to/fullstackcafe/8-ultimate-full-stack-interview-questions-dj5感谢🙌的阅读,祝你面试顺利!
更多 FullStack 面试问答,请访问👉 www.fullstack.cafe